char *p = "string literal"; p[0] = 'S';
char a[] = "string literal"; a[0] = 'S';
这两者之间的主要区别是什么?
定义这两个时,内存中究竟发生了什么?
为什么修改第一个导致未定义的行为?
我读到某个地方,第一个可能存储在只读存储器中;我的问题是:这是怎么发生的?
答案 0 :(得分:4)
p
指向不应修改的字符串文字; a
是一个可以修改的字符数组。重要的是要意识到标准只是简单地说'你不应该修改字符串文字'(或多或少),并且试图这样做会导致任何影响。您的程序可能会崩溃(违反分段或等效);您的代码可能会修改文字;您的代码可能既不会崩溃也不会更改文字。请注意,如果程序中有多个位置出现文字,则可能修改一个将全部修改它们 - 允许编译器在内存中使用字符串文字共享空间。它们甚至不必相同; "string literal"
和"literal"
可以指向内存中相同字符串的不同部分。
ISO / IEC 9899:2011,§6.4.5字符串文字说:
¶6在转换阶段7中,将值为零的字节或代码附加到每个多字节 由字符串文字或文字产生的字符序列。多字节字符 然后,序列用于初始化静态存储持续时间和长度的数组 足以包含序列。 [...]
¶7如果这些数组的元素具有不同的数据,则不明确 适当的价值观如果程序试图修改这样的数组,则行为是 未定义。