【发布时间】:2020-07-14 09:09:34
【问题描述】:
众所周知,不能在 C 中修改字符串文字。spec(第 6.4.5-7 节)明确提到修改字符串文字是未定义的行为。尝试使用 GCC 执行此操作会导致段错误,因为文字存储在只读内存中。
但是,以下代码似乎可以在 GCC 中正常工作。
int main() {
int *arr = (int[]){1,2,3};
arr[1] = 100;
printf("arr[1]: %i\n", arr[1]);
}
查看规范的第 6.5.2.5.-5 节,显示arr 将具有自动存储持续时间,类似于我声明int arr[] = {1,2,3}; 的情况。
字符串文字的处理方式不同有什么原因吗?
【问题讨论】:
-
好吧,我猜在引用的字符串文字段落中说明了一个原因:“如果它们的元素具有适当的值,则未指定这些数组是否不同”。因此,如果您在多个地方使用相同的字符串文字,编译器不必创建多个副本,而是可以一遍又一遍地引用同一个(如果您被允许这样做当然不可能)修改它们)
-
char *foo = (char[]){'f', 'o', 'o', 0}; foo[2] = 'x'; /* now fox */ -
我不明白这个问题。有什么联系?
-
@FelixG 哦!它还说
const复合文字不需要引用不同的对象。而且由于字符串文字被暗示为const...是有道理的。 -
我认为由于历史原因,字符串文字并不意味着是 const 限定的。
const限定符是该语言的一个较新特性(可能在标准化期间从 C++ 借用),但字符串文字自 C 早期就已经存在。
标签: c specifications