一个好玩的死循环
程序员文章站
2022-07-13 22:06:45
...
有这样一个程序
int main()
{
int arr[10] = {1,1,1,1,1,1,1,1,1,1};
int i = 0;
for(i=0; i<=12;i++)
{
arr[i] = 0;
}
return 0;
}
最后的结果是什么呢?
死循环。
为什么呢?
首先,我们先来分析一下内存中的存储问题,如图所示,内存是以栈的形式存储的,并且是由高地址到低地址存储的,那么假设i被存储到了如图位置。我们再来看一下数组,首先内存给数组开辟了一块空间,其次,数组内部是由低到高存储的,就会出现如下的情况,刚好使得a[12]的地址与i的地址相同,于是乎,i辛辛苦苦地增加到了12,你又给i赋为0了,i只好从头再来,这才无限地算下去,成为了一个死循环。当然,这是i的变量创建在前的缘故,若是数组变量创建在前就不会出现这样的情况。另外,这是在vs的编译环境下,vs会自动空两个位置;而对于linix来说,一般是空一个位置;若是vc++6.0,那是一个位置也不会空的。并且,我们在这段代码中,我们还出现了一个问题,那便是数组的越界访问问题。之所以说vs是一个强大的编译器,那是因为作为一个合格的程序员,可能会越界一个位置来访问数组,但应该不会越界2个位置,所以可以有效地减少此类问题的出现。
上一篇: 如何制作一个蓄力跳的功能