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