1
2
3
4
5
6
7
8
9
10
11
int main()
{
int i = 0;
int arr[10] = { 0 };
for (i = 0; i <= 12; i++)
{
arr[i] = 0;
printf("youngsay.cn\n");
}
return 0;
}

观察这段代码,运行会有何效果?

你可能会说,既然越界访问了,那不就报错了?其实不然,运行发现,程序没有报错,一直死循环。

运行效果

注意:该段代码依赖环境,vs编译器,debug模式,x86平台下才有这样的效果。

为什么陷入了死循环,这要从栈区的使用习惯开始说起。静态变量,函数形参都存放到栈中,而栈是从高地址开始存放。**栈区的使用习惯是先使用高地址处的空间。**我们还知道,**数组随着下标变大,地址是由低到高变化的。**所以上段代码在栈中的内存布局,如下图所示。

栈内存布局

vs编译器,debug模式,x86平台下,i和数组arr间刚好空了2个下标的空间。所以i和arr[12]指向了同一块地址,不信我们可以调试看一下i和arr[12]的地址。

地址比较

当i自增到12,执行arr[12]=0时,因为共用同一块空间,i也变成了0,0<12,再一次进入了循环,如此往复便陷入了死循环。