首页 > 解决方案 > 是 char str1[] = {'s','t','r','i','n','g','\0'} 从常量内存段复制到堆栈,如 char str2[] = "细绳”?

问题描述

我知道如果使用下一种语法char str1[] = "string",“字符串”会保存在常量段中并复制到堆栈中(printf("%p", str1)显示堆栈的地址)。我想知道是否char str2[] = {'s','t','r','i','n','g','\0'}与 相同的过程char str1[] = "string",或者只是保存在堆栈中(printf("%p", str2)显示堆栈的地址)。

标签: cstringmemorystackstring-literals

解决方案


这些声明的副作用

char str2[] = {'s','t','r','i','n','g','\0'};

char str1[] = "string";

是不同的。

注意最后的初始化可以写成例如

char str1[] = "str" "ing";

在最后一种情况下(C 标准,6.4.5 字符串文字)

6 在翻译阶段 7,一个字节或值为零的代码被附加到每个由一个或多个字符串文字产生的多字节字符序列。78) 然后使用多字节字符序列初始化一个静态存储持续时间和长度刚好足够的数组包含序列...

在第一种情况下,具有静态存储持续时间的字符数组都不是从用作初始值设定项的单独字符创建的。


推荐阅读