2、请运行下面的代码,观察结果,有人说怎么是死循环,你同意吗?为什么?
#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和数组name[10]是分配在栈上的变量,在内存中的分布如下图:
name[0]
name[1]
name[2]
name[3]
name[4]
name[5]
name[6]
name[7]
name[8]
name[9]
i(name[10])
从上图和表中可以看出i所占据的正是name[10]的位置,而name[10] = 0;这一句会被这样运行: *(name + 10) = 0; 所以这一句的结果,就是把0赋值给i。这样一来在第11次循环的时候,i将会被重新置为0,那么循环结束的条件也就永远不会满足了,循环也就是个死循环了。