这个问题已经在这里有了答案:
9年前关闭。
我知道我可能会在这个问题上败下阵来,但是我有点困惑,而且我还没有设法在SO或google上找到确切的答案(我确信这是正确的-信息太多了在C弦上进行筛选)。另外,我将其标记为C++,因为这是我感兴趣的,即使我们正在专门讨论C风格的字符串。
在这种情况下:
char const a* = "hello";
char const b[] = "goodbye";
我本以为“hello”和“再见”都是不可变的字符串,因为它们来自应该衰减为char const *的字符串文字。
我已经看到,在这种特殊情况下,假设您从b数组中删除了constness,那么更改“hello”将是未定义的,而更改“再见”将是可以的。
我假设在b情况下该字符串是可变的,因为它存储在用户定义的数组中。
在这种情况下,你好和再见是否不同?鉴于此示例,由于某种原因,再见不是字面意义的文字。另外,如果再见不是字符串字面量,我是否可以假设它没有保存在全局内存中,并且在编译时间之后对其唯一的引用是用户数组单元中剩余的内容?
最佳答案
第一个创建一个指向字符串文字"hello"
的指针,该字符串可能存储在程序的可执行镜像的不可写内存中。即使不是,也不允许您修改该数组的内容。
第二个创建一个自动array1(在堆栈上(通常,但是是实现定义的)),并使用字符串"goodbye"
对其进行初始化。相当于
char const b[] = {'g', 'o', 'o', 'd', 'b', 'y', 'e', 0};
因此,虽然
"goodbye"
是不可变的,因为它是一个字符串文字,它是char const[8]
并存储在不可写的内存中,但数组b
是一个不可变的自动数组,因为您将其标记为const
,但是您可以从变量声明中删除const
来制作数组的内容可变。您只用"goodbye"
数组的内容初始化数组的内容。您不允许修改它们中的任何一个,因为它们都是
const char[]
,但是第二个可以更改为char[]
以便可变,而第一个则不能。有关更多信息,请参见此答案:https://stackoverflow.com/a/9106798/726361
1正如R.Martinho Fernandes在评论中指出的那样,如果语法
T x[] = ...
在命名空间范围内,它也可以创建一个静态数组(不是自动的,而是静态的(通常在可执行镜像中,但这是实现定义的)),并且它只是一个自动数组,否则。关于c++ - C字符串数组初始化-这是可变的吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9436781/