先放一组代码
#include <stdio.h>
int main()
{
int i = 0;
int arr[10] = {0};
for(i=0; i<=12; i++)
{
arr[i] = 0;
printf("hehe\n");
}
return 0;
}
代码中出现了十分明显的数组越界,在vs2022的x64环境下是这样的
但在vs2022的x86环境中,程序却并未崩溃,而是陷入了死循环。
经过调试可知,x86环境下arr[12]的地址和i的地址相同,所以在对arr[12]进行赋值时,会同时将i赋为0,再次循环。
之所以会如此,是因为这里创建的变量i,还有数组arr,它们都是局部变量
1.局部变量是定义在栈区的,栈区内存的使用习惯是先使用高地址处的空间,再使用低地址处的空间(当然不同的环境下可能情况就有所不同,我们这里(vs2022-x86环境)是这样的)
2.而数组元素的地址随着下标的增加而增加(这个是确定的)
3.所以数组元素在向后越界访问(访问的地址逐渐变高)的时候,就有可能访问到i,因为i比数组先创建
4.一旦访问到i并将i置成0,就会发生死循环