nice公司笔试题:C语言中数组越界而导致的死循环原因

目录

问题描述

解题思路

下图就是arr数组所存的内容:

&arr[12]和i的地址

死循环产生原因

画图解释一下

为什么问题只会在Debug中出现是因为:

总结


问题描述

有这样一段代码:

#include<stdio.h>
int main()
{
    int i=0;
    int arr[10]={0};
    for (i=0;i<=12;i++)
    {
        arr[i]=0;
        printf("hehe\n");
    }
    return 0;
}

在Debug版本下运行结果是:

 在Release版本下运行结果是:

 请解释在Debug中程序死循环的原因

解题思路

数组内原本只规定有10个元素,但是在循环中i<=12,超出数组三个元素,很明显错误就出在这里,但是我们还需要了解两件事:

  1. 超出的那三个元素是怎么赋值的?
  2. 为什么会一直循环?

为解决这两个问题我们就需要去进行调试,我们可以直接看数组的内存就可以了,看数组中的元素是怎么赋值的,

下图就是arr数组所存的内容:

 我们可以看到,arr[10]、arr[11]、arr[12]虽然已经“非法”,但是仍然被创造出来了,而且也都被赋值为0,这样我们就解决了第一个问题,那么第二个问题,为什么程序会一直循环?

按照循环的条件,i<=12程序就会停止,但是出现了死循环,所以应该是循环的条件随着循环的执行出现了问题,那么我们就需要看看i的地址和循环中的数组地址是否有相关。

&arr[12]和i的地址

我们发现,i的地址竟然跟arr[12]的地址一模一样,到这里我们就知道了这是怎么一回事了

死循环产生原因

 数组超出了所规定的的限制,随着循环的执行,依然会给数组进行赋值,而在这里就出现了问题,随着数组元素的非法越界,导致最后一个数组元素也就是arr[12]的地址跟循环条件中的i的地址重合了,所以随着arr[12]被赋值为0,而导致i的值也被赋值为0,所以循环就会变成死循环。

画图解释一下

数组的地址本来是在i地址的后面,但是随着循环的执行,数组中元素的地址不断往高地址中申请,最后导致arr[12]的地址跟循环条件中的i的地址重合了,所以i重新赋值为0,就导致了死循环。

为什么问题只会在Debug中出现是因为:

Debug通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。Release称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。

总结

  1. 栈区的默认使用:先使用高地址处的空间再使用低地址处的空间
  2. 数组随着下标的增长地址是由低到高变化
  3. vc6.0环境下i<=10就死循环了
  4. gcc编译器  i<=11就死循环了
  5. VS2013    i<=12死循环
  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

阳862

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

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

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

打赏作者

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

抵扣说明:

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

余额充值