为什么这个程序不会出现段错误?
当我为 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
What causes the output "Hello" when I enable -O for gcc ? Shouldn't it still segfault (according to this 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
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
更改字符串文字是未定义的行为(可能会崩溃,可能不会执行任何操作等)。 C 常见问题解答中有很好的解释。
It's undefined behavior (might crash, might not do anything, etc) to change string literals. Well explained in a C FAQ.