为什么我没有“分段错误”?

可能重复:
当我在数组末尾写入时,为什么不会出现分段错误?

此代码编译并运行,没有任何错误。 但是怎么样?

#include  int main (void) { int foo[2]; foo[8] = 4; /* How could this happen? */ printf("%d\n", foo[8]); return 0; } 

我正在使用Arch Linux x86_64上的GCC 4.7.2进行编译。

 gcc -Wall -o "main" "main.c" 

因为未定义的行为并不意味着“您将收到段错误”,这将是定义的行为。

假设您正在调试模式下运行,并且您的编译器正在填充堆栈/局部变量空间。 你可能只是写入堆栈空间的一些未使用的部分。

在星期一构建一个发布版本,当你的编译器感到头晕目眩时,现在你覆盖了返回地址,或者设置调用printf的代码,无论如何。 哎呀。

只有一个可能的结果,但你明白了。

foo[8]可以为您的程序分配(例如填充目的),属于您的操作系统。 如果行为不明确,任何事情都可能发生; 你运气不好,因为它有效。

尝试

 foo[1000000]=42; 

看看会发生什么。