欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

一个好玩的死循环

程序员文章站 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个位置,所以可以有效地减少此类问题的出现。

一个好玩的死循环