数组越界导致死循环
在VS2022、X86、Debug 的环境下,编译器不做任何优化的话,下⾯代码执⾏的结果是啥?
#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;
}
我们会发现代码死循环了,为什么会这样呢?
- 栈区内存的使⽤习惯是从⾼地址向低地址使⽤的,所以变量i的地址是较⼤的。arr数组的地址整体是⼩于i的地址。
- 在给数组分配内存的时候是一次行分配一个数组大小的空间,然后把数组元素的值从最低地址到高地址存到内存中,所以,数组在内存中的存放是:随着下标的增⻓,地址是由低到⾼变化的。
所以根据代码,就能理解为什么是上图的代码布局了。如果是上边的内存布局,那随着数组下标的增⻓,往后越界就有可能覆盖到i,这样就可能造成死循环的。
这⾥肯定有人有疑问:为什么i和arr数组之间恰好空出来2个整型的空间呢?这⾥确实是巧合,在不同的编译器下可能中间的空出的空间⼤⼩是不⼀样的,代码中这些变量内存的分配和地址分配是编译器指定的,所以的不同的编译器之间就有差异了。
所以这个题⽬是和环境相关的。