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

时间:2012-11-04 17:54:21

标签: c string

  

可能重复:
  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"

3 个答案:

答案 0 :(得分:5)

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

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

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

尝试

foo[1000000]=42; 

看看会发生什么。