以一道代码为例:
#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的创立的位置是放在数组之前的。
在数组中,数组的存储是随着下标的增长由低到高变化着。
所以如果i和arr之间有适当的空间,那对arr访问的时候就可能覆盖到i,从而导致死循环的实现。
通过调试窗口可以看出,此时的i和arr[12]的地址刚好相同,所以陷入的死循环。
以上这道题如果把i变量的创建放在arr之后,那就不会出现死循环,但最主要的还是arr数据越界访问的问题而不是变量创建的问题,所以在编写代码中尽量不要让数组越界访问,以免出现bug。