可能重复:
Why don’t I get a segmentation fault when I write beyond the end of an array?
此代码编译并运行时没有任何错误。但是如何?
#include <stdio.h>
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"
答案 0 :(得分:5)
因为未定义的行为并不意味着“您将收到段错误”,这将是定义的行为。
假设您正在调试模式下运行,并且您的编译器正在填充堆栈/局部变量空间。你可能只是写入堆栈空间的一些未使用的部分。
在星期一构建一个发布版本,当你的编译器感到胡思乱想时,现在你覆盖了返回地址,或者设置调用printf
的代码,无论如何。哎呀。
只有一个可能的结果,但你明白了。
答案 1 :(得分:1)
foo[8]
可能会为您的程序分配(例如,填充目的),属于您的操作系统。如果行为不明确,任何事情都可能发生;你运气不好,因为它有效。
答案 2 :(得分:0)
尝试
foo[1000000]=42;
看看会发生什么。