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
为什么在运行时或编译时没有抛出错误?
您听说过缓冲区溢出导致的所有安全问题吗?它们存在是因为 C 没有任何自动数组边界检查。程序员有责任确保他们不会超出数组限制,编译器不会检查它。
只要确保你没有解决任何超出边界的问题,因为 C 不会检查数组边界。
int a[2]
被分配为堆栈上的自动变量。在 Windows 中,堆栈最初分配为 1MB 用于进程。所以,真正发生的事情是,当代码分配a[2] = 3;
堆栈帧之外的区域时main()
被更新。
这通常会导致问题,例如分段错误,但在简单的程序中,这样的东西有时仍然有效。
一个有趣的测试是调用一个还定义和设置一些自动变量的子例程,然后在它返回打印值a[2]
以查看它是否被子例程的堆栈帧覆盖?如果你这样做,请告诉我结果!