为什么这个程序没有段错误?

vik*_*man 2 c gcc pointers segmentation-fault

当我为gcc启用-O时,是什么导致输出"Hello"?它不应该仍然是段错(根据这个维基)?

% cat segv.c 
#include <stdio.h>
int main()
{
    char * s = "Hello";
    s[0] = 'Y';
    puts(s);
    return 0;
}
% gcc segv.c && ./a.out 
zsh: segmentation fault  ./a.out
% gcc -O segv.c && ./a.out 
Hello
Run Code Online (Sandbox Code Playgroud)

cni*_*tar 12

它是未定义的行为(可能会崩溃,可能不会做任何事情等)来更改字符串文字.在C FAQ中很好地解释了.

6.4.5/6

如果这些数组的元素具有适当的值,则不确定这些数组是否是不同的.如果程序试图修改这样的数组,则行为未定义.