int main()
{
int i = 0;
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
for (i = 0; i <= 12; i++)
{
printf("hehe\n");
arr[i]=0;
}
return 0;
}
为什么会死循环?
arr数组只有10个数,但i循环到11,i下标越界(实际i=10时下标就越界,基于每个编译器和版本的区别,内存的布局有差异,vs2022在下标为11才会进入死循环),打印hehe出现死循环。
首先我们要明确两点:
1.栈区的默认使用规则:先使用高地址处的空间,再使用低地址处的空间,所以我们创建的变量i的地址其实是最高的地址,数组首元素的地址最低;
2.数组随着下标的增长,地址由低到高变化 ;
正常将arr[i]改为0,当i到10后,仍然会将空间的数改为0。随着数组下标的增长(i++),地址越来越高,有可能在高地址的数组元素恰好与我们创建的变量地址相同,当这种情况发生时,就会发生死循环:死循环的原因是i==arr[11],把arr[11]赋值为0相当于把i赋值为0。
i在内存的布局就是这样。