1
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

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

4

3 回答 3

13

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

于 2013-08-16T04:48:31.690 回答
0

只要确保你没有解决任何超出边界的问题,因为 C 不会检查数组边界。

于 2013-08-16T05:16:00.073 回答
0

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

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

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

于 2013-08-16T06:04:10.620 回答