3

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

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

#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"
4

3 回答 3

5

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

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

在星期一构建一个发布版本,当你的编译器感觉很古怪,现在你覆盖了返回地址,或者设置调用的代码printf,不管怎样。哎呀。

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

于 2012-11-04T17:56:44.240 回答
1

foo[8]可能分配给您的程序(例如填充目的),属于您的操作系统。对于未定义的行为,任何事情都可能发生;你很不幸,因为它有效。

于 2012-11-04T17:56:36.507 回答
0

尝试

foo[1000000]=42; 

看看会发生什么。

于 2012-11-04T17:56:51.190 回答