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

时间:2011-10-13 19:07:18

标签: c pointers gcc segmentation-fault

为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

1 个答案:

答案 0 :(得分:12)

未定义的行为(可能会崩溃,可能无法执行任何操作等)来更改字符串文字。在C FAQ中解释得很清楚。

  

6.4.5 / 6

     

没有特别说明这些阵列是否与它们不同   元素具有适当的值。如果程序试图   修改这样的数组,行为是未定义的。