我对这种行为非常困惑:
int main(void) {
char *test_string = "test_string";
*test_string = 'a'; //segfaults
return 0;
}
int main(void) {
char test_string[] = "test_string";
*test_string = 'a'; //OK
return 0;
}
由于N1570, Section 6.3.2.1(p3)
声明以下内容,我希望它应该能发挥同样的作用:
除非它是
sizeof
运算符的操作数,否则_Alignof
运算符或unary &
运算符,或者是用于 初始化数组,其类型为“数组类型”的表达式为 转换为类型为“要输入的指针”的表达式 到数组对象的初始元素,而不是左值。
为什么第一次出现段错误?
答案 0 :(得分:6)
第一种情况下的问题是,test_string
指向string literal,而您正在尝试修改该字符串文字。这会调用undefined behavior
引用C11
,第6.4.5章
[...]如果程序尝试修改这样的数组,则行为是 未定义。
另一方面,在第二种情况下,test_string
是一个数组,可以修改。