C语言入门笔记 第十一讲【一道有趣的死循环问题】

一、代码

给出如下代码:

#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;
}

照理说,数组大小为10,

但是i缺多访问了第11,12,13个元素,

这就造成了越界访问;

但是,程序会执行,

并且无限的打印hehe。

二、分析

我们打开监视窗口,

发现即便数组越界了,还是可以将10和11正确修改,

修改完11后,i的值是11;

然后i++,变成12,

这时候把arr[12]改成0——

我们发现,i的值也变成0了。

取出i和arr[12]的地址一看,

原来他们俩地址一样,

导致修改12的时候把i的值也变为了0,那么还是满足循环条件,

从而进行无限循环,

从而导致死循环。

我们来分析一下内存里的情况:

首先,我们创建局部变量i,再创建数组arr,

而栈区的默认使用是先使用高地址处的空间,再使用低地址处的空间。

所以,i被放进了高地址,arr从低地址开始开辟空间。

又因为,随着数组下标的增长,地址由低到高变化,

而数组本身的地址是低于i的,

所以完全有可能在数组越界后,遇到i,

也就有可能在对数组元素进行赋值时,和i冲突,

从而把i的值进行改变了。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值