为什么这两个代码段有不同的行为
char p[] = "hello";
p[0] = 'W'; //works fine
虽然这会产生segmentation fault
char *ptr = "hello";
ptr[0] = 'W'; // undefined behavior
两个代码之间有什么区别,为什么我无法使用指针修改字符串?
答案 0 :(得分:2)
在你的第二个案例中,
char *ptr = "hello";
ptr
指向字符串文字。您无法修改字符串文字的内容。期。它调用undefined behavior。
引用C11
,章节§6.4.5,字符串文字
[..]如果程序试图修改这样的数组,行为是 未定义。
相比之下,第一种情况是使用字符串文字创建数组和初始化。阵列完全可以修改。你很高兴。
答案 1 :(得分:2)
第一个代码初始化一个数组并修改其元素是完全合法的,因为该数组不是const
而p[0]
是一个有效的索引。
第二个代码是修改指针指向的字符串文字。它将调用未定义的行为。
引自N1570 6.4.5字符串文字:
7如果这些数组的元素具有不同的特征,则未指定这些数组是否相同 适当的价值观如果程序试图修改这样的数组,则行为是 未定义。