这个问题是在学习程序地址空间的时候回忆C语言学习时想到的
我们会遇到下面的情况
int main()
{
int i = 0;
int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
for(i = 0; i <= 12; i++)
{
arr[i] = 0;
}
return 0;
}
程序死循环了
问题就出在程序的存储空间上,i和arr都是局部变量,都存储在栈空间上的,并且程序对于栈空间的使用是先使用高地址,再使用低地址,所以内存分布图如下
我们在程序中先定义了 i,所以先为 i 开辟了空间,里面存储的数据是0,然后再为数组arr开辟空间,并且对于数组越界的检查并没有太严格,这里我们循环这个数组,去访问到了arr[10]、arr[11]、arr[12]的空间,并分别对其赋值为0,由于栈空间的“生长方向”是先使用高地址,再使用低地址,所以在我们访问arr[12]时,就同时访问到了 i 的空间,并将其赋值为0,此时 i 从12变成了0,又继续循环下去
这种情况比较特殊,是否会触发,还需要看编译器检查的脸色,所以还得多调试看内存空间的存储情况
这里没有报错的原因可以简单理解为当前CPU正在执行这个循环,只要这个循环还没有结束,CPU就不会去检查越界的问题,如果当我们的循环结束后,才会去检查刚刚是否有越界访问的情况(通过测试,如果只是"读",没有写入,越界了也不会报错,越界写,就会报错,但是去读一个我们程序未定义的内存空间,是没有任何意义,并且风险很大的