为什么用不同的方式修改字符串会有不同的行为?

Why modifying a string with different ways have different behaviors?

为什么这两个代码片段有不同的行为

char p[] = "hello";
p[0] = 'W'; //works fine

虽然这给出了 segmentation fault

char *ptr = "hello"; 
ptr[0] = 'W'; // undefined behavior

这两种代码有什么区别,为什么我无法使用指针修改字符串?

在你的第二种情况下,

char *ptr = "hello"; 

ptr 指向一个 字符串文字 。您不能修改 字符串文字 的内容。时期。它调用 undefined behavior.

引用 C11,章节 §6.4.5,字符串文字

[..] If the program attempts to modify such an array, the behavior is undefined.

相比之下,第一种情况是创建一个 array 并使用该字符串文字 initializing 。该数组是完全可修改的。你可以开始了。

第一段代码初始化了一个数组,修改它的元素是完全合法的,因为数组不是const并且p[0]是一个有效的索引。

第二段代码是修改指针指向的字符串文字。它将调用 未定义的行为

引自N1570 6.4.5 字符串文字:

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.