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

时间:2016-04-14 07:58:08

标签: c arrays string pointers string-literals

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

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

虽然这会产生segmentation fault

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

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

2 个答案:

答案 0 :(得分:2)

在你的第二个案例中,

char *ptr = "hello"; 

ptr指向字符串文字。您无法修改字符串文字的内容。期。它调用undefined behavior

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

  

[..]如果程序试图修改这样的数组,行为是   未定义。

相比之下,第一种情况是使用字符串文字创建数组初始化。阵列完全可以修改。你很高兴。

答案 1 :(得分:2)

第一个代码初始化一个数组并修改其元素是完全合法的,因为该数组不是constp[0]是一个有效的索引。

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

引自N1570 6.4.5字符串文字:

  

7如果这些数组的元素具有不同的特征,则未指定这些数组是否相同   适当的价值观如果程序试图修改这样的数组,则行为是   未定义。