char *p = "string literal"; p[0] = 'S';
char a[] = "string literal"; a[0] = 'S';
这两者之间的主要区别是什么?
定义这两个值时,内存中到底发生了什么?
为什么修改第一个会导致未定义的行为?
我读到第一个可能存储在只读存储器中的地方;我的问题是:这是怎么发生的?
最佳答案
p
指向一个不应被修改的字符串文字;a
是一个可以修改的字符数组。- 字符串文字很可能位于程序的只读部分(通常是“文本”段以及代码的其余部分),而字符数组则存储在可修改的内存中。
- 您不得修改字符串文字;这样做会调用未定义的行为。
- 通常,字符串与可执行代码一起存储在“文本”段中。
重要的是要认识到该标准只是简单地说“您不得修改字符串文字”(或多或少),并且尝试这样做可能会导致任何效果。您的程序可能会崩溃(分段违规或类似情况);您的代码可能会修改文字;您的代码可能既不会崩溃也不会更改文字。请注意,如果程序中有多个位置出现该文字,则修改一个位置可能会修改所有位置 - 允许编译器让字符串文字共享内存中的空间。它们甚至不必完全相同; “字符串文字”
和 “文字”
可以是指向内存中同一字符串的不同部分的指针。
ISO/IEC 9899:2011,§6.4.5 字符串文字说:
¶6 In translation phase 7, a byte or code of value zero is appended to each multibyte character sequence that results from a string literal or literals. The multibyte character sequence is then used to initialize an array of static storage duration and length just sufficient to contain the sequence. [...]
¶7 It is unspecified whether these arrays are distinct provided their elements have the appropriate values. If the program attempts to modify such an array, the behavior is undefined.
关于c - 给定 char *p = "string",为什么修改会导致未定义的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16380420/