C语言中字符串的存储方式

在C语言中,我们可以使用字符指针或字符数组来引用字符串。

字符串作为字符数组

C


CODEBLOCK_3ed467ec

当字符串被声明为字符数组时,它们像C语言中的其他类型数组一样存储。例如,如果 str[] 是一个 <a href="https://user-web.icecube.wisc.edu/~dglo/cclass/vstorage.html">自动变量,那么该字符串存储在栈段;如果它是全局变量或静态变量,则存储在 <a href="https://en.wikipedia.org/wiki/Datasegment">数据段,以此类推。

使用字符指针定义字符串

使用字符指针可以通过两种方式存储字符串:

1) 存储在共享段中的只读字符串。

当一个字符串值直接赋给指针时,在大多数编译器中,它被存储在一个只读块中(通常在数据段中),该块在函数之间是共享的。

C


CODEBLOCK_4527f309

在上述代码行中,"GfG" 被存储在一个共享的只读位置,但指针 str 本身存储在读写内存中。你可以改变 str 指向其他内容,但不能修改 str 当前指向的值。因此,这种字符串仅适用于我们在程序后期不打算修改字符串的情况。

2) 在堆段中动态分配。

字符串的存储方式类似于C语言中其他动态分配的对象,并且可以在函数之间共享。

C


CODEBLOCK_4917ae50

让我们通过一些示例来更好地理解上述存储字符串的方式。

示例 1(尝试修改字符串)

下面的程序可能会崩溃(产生段错误),因为 *(str+1) = ‘n’ 这一行试图写入只读内存。

C


CODEBLOCK_34c32719

下面的程序运行完全正常,因为 str[] 存储在可写的栈段中。

C


CODEBLOCK_420cab73

下面的程序也运行完全正常,因为 str 指向的数据存储在可写的堆段中。

C


CODEBLOCK_51bb6c73

示例 2(尝试从函数返回字符串)

下面的程序运行完全正常,因为字符串存储在共享段中,存储的数据在 getString() 返回后依然存在。

C


CODEBLOCK_1328fa30

Output

GfG

下面的程序也运行完全正常,因为字符串存储在堆段中,而存储在堆段中的数据在 getString() 返回后依然存在。

C


CODEBLOCK_0b480ff1

Output

GfG

但是,下面的程序可能会打印一些垃圾数据,因为字符串存储在函数 getString() 的栈帧中,一旦 getString() 返回,数据可能就不复存在了。

C


CODEBLOCK_9ff80688

Output

???B?

我们知道像 String s= "Aakash" 这样的代码;

它会导致堆分配,这非常昂贵,你必须经历每一步然后再返回。

->A

->a

->k

->a

->s

->h

正如你所见,涉及了如此多的分配,这使得堆操作成本很高。为了提高效率,大字符串的内存分配在堆上,而小字符串则分配在静态缓冲区中。例如,如果字符串超过 25 个字符(如 MAC 地址的情况),它就会进入…

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。如需转载,请注明文章出处豆丁博客和来源网址。https://shluqu.cn/53001.html
点赞
0.00 平均评分 (0% 分数) - 0