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

本文探讨了一段C语言代码在VS开发环境中导致死循环的原因。代码中,数组越界修改了栈上相邻的`i`变量的值,使得`for`循环条件始终为真,从而引发无限循环。作者通过调试揭示了局部变量在栈上的存储布局,并指出这种现象依赖于不同的编译环境。为了避免此类问题,建议程序员注意避免数组越界访问。
摘要由CSDN通过智能技术生成

我们先来看看这段代码(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个空间,也就是上述所说情况。所以啊,为了不出现各种难以预料的情况,各位友友们写程序时最好还是注意一下啦,不要让数组越界访问了哦~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

哆啦A梦的110

你的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值