一、代码
给出如下代码:
#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的值进行改变了。
本文分析了一个C语言程序中因数组越界导致的死循环问题。当数组访问超过其边界时,由于栈空间布局,修改数组元素意外地改变了变量i的值,造成i的值回滚至0,形成无限循环。通过内存监视窗口,揭示了栈上变量i与数组元素地址重叠的现象,深入理解了栈内存分配和越界访问的后果。
2723

被折叠的 条评论
为什么被折叠?



