【问题标题】:Why doesn't this program segfault?为什么这个程序没有段错误?
【发布时间】:2011-12-07 05:35:34
【问题描述】:

当我为 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

【问题讨论】:

  • 它说在具有内存保护的平台上。你在哪个平台上?
  • 接受解释这是“未定义行为”的答案之一,它允许编译器为整个程序发出任何内容。但要回答您的问题,"Hello"const char *,这意味着它的内容无法更改,因此优化器只是放弃了您修改它的尝试。 (这是一个完全有效的优化,因为修改尝试本身会调用未定义的行为。)
  • No C 字符串文字不是const;如果是,则分配将违反约束。 (在 C++ 中它们是 const。)但是,是的,尝试修改字符串文字是未定义的行为。
  • @Keith:感谢您的更正。过去几年我一直在使用 C++,所以我忘记了这个细节。
  • @hroptatyr 我在 amd64 linux 上!

标签: c pointers gcc segmentation-fault


【解决方案1】:

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

6.4.5/6

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

【讨论】:

    猜你喜欢
    • 2020-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多