解引用指针并为其赋值

时间:2018-12-17 11:17:35

标签: c arrays pointers segmentation-fault string-literals

我对这种行为非常困惑:

int main(void) {
    char *test_string = "test_string";
    *test_string = 'a'; //segfaults
    return 0;
}

DEMO

int main(void) {
    char test_string[] = "test_string";
    *test_string = 'a'; //OK
    return 0;
}

DEMO

由于N1570, Section 6.3.2.1(p3)声明以下内容,我希望它应该能发挥同样的作用:

  

除非它是sizeof运算符的操作数,否则_Alignof   运算符或unary &运算符,或者是用于   初始化数组,其类型为“数组类型”的表达式为   转换为类型为“要输入的指针”的表达式   到数组对象的初始元素,而不是左值。

为什么第一次出现段错误?

1 个答案:

答案 0 :(得分:6)

第一种情况下的问题是,test_string指向string literal,而您正在尝试修改该字符串文字。这会调用undefined behavior

引用C11,第6.4.5章

  

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

另一方面,在第二种情况下,test_string是一个数组,可以修改。