这个问题在这里已有答案:
我在C中运行以下代码(使用gcc编译): -
#include <stdio.h>
int main() {
float box[2][2];
box[3][3] = 1;
printf("%f", box[3][3]);
return 0;
}
输出: -
1.000000
为什么C不给我分段错误/数组索引超出范围?任何帮助表示赞赏。
是的,C不会阻止超出限制的访问,它将它们指定为具有未定义的行为。
由于程序似乎具有预期的行为,因此未定义的行为有时会非常混乱。
你正在修改一个超出box
结尾的内存块,这可能导致崩溃,但是没有(或者还没有......)并且从它读回来返回写入的值(这也是未定义的行为,但看起来似乎上班)。
程序退出,并且有可能没有发生进一步的损坏,但谁知道...修改box[3][3]
可能已经改变了存储函数返回值的堆栈上的位置,导致main
返回到其后的崩溃打电话,或其他任何事情......希望周一在巴黎圣母院大火。