为什么编译或运行时不会抛出错误

时间:2013-08-16 04:44:06

标签: c arrays

int main()
{
    int a[2] = {1,2};
    a[2] = 3;
    printf("\n\n%d  %d  %d\n\n",a[0],a[1],a[2]);
    return 0;
}

我输出为1 2 3

为什么在运行时或编译时没有抛出错误?

3 个答案:

答案 0 :(得分:13)

您是否听说过缓冲区溢出导致的所有安全问题?它们存在是因为C没有任何自动数组边界检查。程序员有责任确保它们不会超出数组限制,编译器不会检查它。

答案 1 :(得分:0)

只是确保你没有解决边界以外的任何问题,因为C不检查数组边界。

答案 2 :(得分:0)

int a[2]被分配为堆栈上的自动变量。在Windows中,堆栈最初为进程分配为1MB。所以,真正发生的事情是,当a[2] = 3;的代码分配main()时,a[2]的堆栈框架之外的区域被更新。

这通常会导致问题,例如分段错误,但在简单的程序中,这样的东西有时仍然有效。

一个有趣的测试是调用一个子例程,它也定义并设置一些自动变量,并在它返回后打印{{1}}的值,以查看它是否被子例程的堆栈帧覆盖?如果你这样做,请告诉我结果!