【发布时间】: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