C语言中因数组越界而造成死循环原因之一详解

我们先来看看这段代码(VS开发环境):

#include <stdio.h>
int main()
{
    int i = 0;
    int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
    for (i = 0; i <= 12; i++)
    {
        arr[i] = 0;
        printf("hello\n");
    }
    return 0;
}

大家可以猜一下在VS开发环境下最后的输出结果是什么,是输出13个hello还是编译报错还是其他的?算了,答案揭晓,是死循环,输出无数个hello。为什么会这样呢,接下来让我来仔细讲解一番哈~

通过调试,我们可以发现arr[12]的值始终与i的值相同,也就是说当arr[12]改变时,i也会随之改变,反之也是如此:

 

 看到这里我们不妨可以猜一下是不是两者的地址相同,不然为什么会你变我也变呢?通过查看两者的地址,发现真的是一样的!

???为什么呢???

 讲之前,我们要首先知道,在此程序中,i和arr数组是局部变量,而局部变量是存储在栈区的。

栈的使用习惯是按照代码定义变量的顺序,先分配高地址处的空间,再分配低地址处的空间,而数组是随着下标的增长,地址逐渐变大。以下图可以简单表示一下上述所说内容:

 如图,如果i和arr数组之间的空间合适的话,就有可能使用的arr数组向后越界访问到了i,导致arr数组中某个值改变时i的值也被改变了,这样就很容易造成死循环。

最后再补充一下,上述代码的运行结果是严格依赖于编译环境的环境不同,最后的结果也可能不同。比如在VC6.0中,i和arr是连续的,中间没有空间。在gcc中i和arr之间有一个空间。在VS2010,2013,2019等中,i和arr之间有2个空间,也就是上述所说情况。所以啊,为了不出现各种难以预料的情况,各位友友们写程序时最好还是注意一下啦,不要让数组越界访问了哦~~

猜你喜欢

转载自blog.csdn.net/m0_63039919/article/details/121479389
今日推荐