请运行下面的代码,观察结果,有人说怎么是死循环,你同意吗?为什么?
#include <stdio.h>
int main()
{
int i = 0;
int name[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
for (i = 0; i <= 10; i++)
{
name[i] = 0;
printf("ok/n" );
}
return 0;
}
这段代码一开始我还以为是小儿科,一个很傻逼的代码,完全不认为会是死循环 … 后来事实证明,是我自己傻逼了,好了,不多说了,现在揭晓答案了。
答案:
这段程序会进入死循环,当 i 循环到 10 的时候,表面上看上去 ”name[10]= 0” 这句操作是会在预料之外的,因为数组中的十个数字的最后一个是 name[9], 但就这最后那句操作的时候,神奇的事情发生了,程序发生了死循环, i 神奇的又被置成了 0.
其实道理很简单,因为 name[10] 其实就是变量 i, 通过调试我们可以知道,这两个变量指向地址是完全相同的。在函数为局部变量在栈中申请空间的时候, i 在 name 前面申请, i 就在 name 的后面,所以要先向高地址写入数据, i 与 name 数组是连续排列的,所以 ”name[10]= 0” 这句其实就是 ”i = 0” 。
zz from http://blog.youkuaiyun.com/DrZinc/archive/2009/11/21/4848661.aspx