为gcc启用-O时,输出“Hello”的原因是什么?它不应该仍然是段错(根据这个wiki)?
% 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
答案 0 :(得分:12)
未定义的行为(可能会崩溃,可能无法执行任何操作等)来更改字符串文字。在C FAQ中解释得很清楚。
6.4.5 / 6
没有特别说明这些阵列是否与它们不同 元素具有适当的值。如果程序试图 修改这样的数组,行为是未定义的。