一、代码
给出如下代码:
#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;
}
照理说,数组大小为10,
但是i缺多访问了第11,12,13个元素,
这就造成了越界访问;
但是,程序会执行,
并且无限的打印hehe。
二、分析
我们打开监视窗口,
发现即便数组越界了,还是可以将10和11正确修改,
修改完11后,i的值是11;
然后i++,变成12,
这时候把arr[12]改成0——
我们发现,i的值也变成0了。
取出i和arr[12]的地址一看,
原来他们俩地址一样,
导致修改12的时候把i的值也变为了0,那么还是满足循环条件,
从而进行无限循环,
从而导致死循环。
我们来分析一下内存里的情况:
首先,我们创建局部变量i,再创建数组arr,
而栈区的默认使用是先使用高地址处的空间,再使用低地址处的空间。
所以,i被放进了高地址,arr从低地址开始开辟空间。
又因为,随着数组下标的增长,地址由低到高变化,
而数组本身的地址是低于i的,
所以完全有可能在数组越界后,遇到i,
也就有可能在对数组元素进行赋值时,和i冲突,
从而把i的值进行改变了。