c - 给定 char *p = "string",为什么修改会导致未定义的行为?

标签 c arrays pointers char

char *p = "string literal"; p[0] = 'S';

char a[] = "string literal"; a[0] = 'S';
  1. 这两者之间的主要区别是什么?

  2. 定义这两个值时,内存中到底发生了什么?

  3. 为什么修改第一个会导致未定义的行为?

  4. 我读到第一个可能存储在只读存储器中的地方;我的问题是:这是怎么发生的?

最佳答案

  1. p 指向一个不应被修改的字符串文字; a 是一个可以修改的字符数组。
  2. 字符串文字很可能位于程序的只读部分(通常是“文本”段以及代码的其余部分),而字符数组则存储在可修改的内存中。
  3. 您不得修改字符串文字;这样做会调用未定义的行为。
  4. 通常,字符串与可执行代码一起存储在“文本”段中。

重要的是要认识到该标准只是简单地说“您不得修改字符串文字”(或多或少),并且尝试这样做可能会导致任何效果。您的程序可能会崩溃(分段违规或类似情况);您的代码可能会修改文字;您的代码可能既不会崩溃也不会更改文字。请注意,如果程序中有多个位置出现该文字,则修改一个位置可能会修改所有位置 - 允许编译器让字符串文字共享内存中的空间。它们甚至不必完全相同; “字符串文字”“文字” 可以是指向内存中同一字符串的不同部分的指针。

<小时/>

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/

相关文章:

c - 在 Linux 上加载共享库会产生多少运行时开销

ios - Udp套接字绑定(bind)失败

c - 将结构插入动态数组

c - 这个 reverse() 函数在下面的代码中是如何工作的?

c++ - 在基类数组中使用子类方法的默认值

c++ - 通过一串字符并提取数字?

c - 整个窗口的 glReadPixels (OpenGL)

c++ - 访问堆栈中的数组会影响性能吗

javascript - 如何在 JavaScript 中生成数组的数字键?

java - Java中指针被什么代替了?