为什么这个程序不会出现段错误?

发布于 2024-12-09 14:17:13 字数 421 浏览 1 评论 0原文

当我为 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

深海夜未眠 2024-12-16 14:17:13

更改字符串文字是未定义的行为(可能会崩溃,可能不会执行任何操作等)。 C 常见问题解答中有很好的解释。

6.4.5/6

未指定这些数组是否不同,只要它们的
元素具有适当的值。如果程序尝试
修改这样的数组,行为未定义。

It's undefined behavior (might crash, might not do anything, etc) to change string literals. Well explained in a C FAQ.

6.4.5/6

It is unspecified whether these arrays are distinct provided their
elements have the appropriate values. If the program attempts to
modify such an array,the behavior is undefined.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文