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

时间:2013-05-05 01:03:52

标签: c arrays pointers char

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

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

  2. 定义这两个时,内存中究竟发生了什么?

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

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

1 个答案:

答案 0 :(得分:4)

  1. p指向不应修改的字符串文字; a是一个可以修改的字符数组。
  2. 字符串文字可能位于程序的只读部分(通常是“文本”段以及其余代码),而字符数组存储在可修改的内存中。
  3. 您不能修改字符串文字;这样做会调用未定义的行为。
  4. 通常,字符串与可执行代码一起存储在“文本”段中。
  5. 重要的是要意识到标准只是简单地说'你不应该修改字符串文字'(或多或少),并且试图这样做会导致任何影响。您的程序可能会崩溃(违反分段或等效);您的代码可能会修改文字;您的代码可能既不会崩溃也不会更改文字。请注意,如果程序中有多个位置出现文字,则可能修改一个将全部修改它们 - 允许编译器在内存中使用字符串文字共享空间。它们甚至不必相同; "string literal""literal"可以指向内存中相同字符串的不同部分。


    ISO / IEC 9899:2011,§6.4.5字符串文字说:

      

    ¶6在转换阶段7中,将值为零的字节或代码附加到每个多字节   由字符串文字或文字产生的字符序列。多字节字符   然后,序列用于初始化静态存储持续时间和长度的数组   足以包含序列。 [...]

         

    ¶7如果这些数组的元素具有不同的数据,则不明确   适当的价值观如果程序试图修改这样的数组,则行为是   未定义。