为什么我没有“分段错误”?
可能重复:
当我在数组末尾写入时,为什么不会出现分段错误?
此代码编译并运行,没有任何错误。 但是怎么样?
#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;
看看会发生什么。