gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 18:32:08 24 4
gpt4 key购买 nike

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com