Derefence指针并为其赋值

Som*_*ame -1 c arrays pointers segmentation-fault string-literals

我对这种行为感到很困惑:

int main(void) {
    char *test_string = "test_string";
    *test_string = 'a'; //segfaults
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

DEMO

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

DEMO

我预计它应该有相同的工作,因为N1570, Section 6.3.2.1(p3)声明如下:

除非它是运算sizeof符,_Alignof 运算符或unary &运算符的操作数,或者是用于初始化数组的字符串文字,否则具有类型''数组'类型'的表达式将转换为类型为''指针的表达式键入''指向数组对象的初始元素,而不是左值.

为什么第一个段错?

Sou*_*osh 6

第一种情况中的问题是,test_string指向字符串文字并且您正在尝试修改该字符串文字.这会调用未定义的行为

引用C11,第§6.4.5章

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

另一方面,在第二种情况下,test_string是一个数组并且它是可修改的.