例子分析
int main()
{
int i = 0;
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
for (i = 0; i <= 12; i++)
{
arr[i] = 0;
printf("hehe\n");
}
return 0;
}
代码很容易看出出现了越界,运行的结果也是死循环。出现这种情况我们就需要进行调试分析
当循环到arr[9]也就是i=10最后一个元素的时候.因为数组再内存中连续的空间所有虽然数组访问越界但还会访问arr[10],arr[11],arr[12]这三个越界且没有初始的空间,这三个没有初始化的话应该是存放随机值这里我看一下内存的情况
当i=10的时候其实对应的访问的就是arr[10](已经越界),且arr[10]里是随机值,进入循环语句将随机值赋值为0
同样地当i=11的时候arr[11]也应该是随机值进入循环语句也应该变为0
有了以上的逻辑那么当i=12的时候,arr[12]里的值不应该也是随机值吗?但是这里内存中显示的并不是随机值,继续调试
这里给arr[12]赋值0的时候i的值也变为0
这就很奇怪,造成这种现象的原因只可能是arr[12]和i是同一个空间,这里我们可以取地址arr和i确实能发现他们两个是同一个空间的
如何解释这个现象呢?我们画图来解释
arr使用的方式是从低到高使用,所有数组地址由低到高
当给arr赋值0的时候因为arr[12]与i是同一个空间所以当i=12的时候arr[12]变为0,那么i也会变为0所以会一直死循环下去