C陷阱_常见错误类型之数组越界死循环

C语言中我们常见写出来的代码死循环了,死循环的原因又有很多种,接下来介绍一种由于数组越界而导致的死循环。

问题如下

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

在这里插入图片描述

我们可以看到,当代码跑起来后,并没有报错,而是陷入了死循环打印hello。
当我们凭判断无法找出问题根源所在时可以进入调试。

在这里插入图片描述

我们可以看到当i的值发生变化时,arr数组里面元素的值也在相应的变化,一切都按照我们所想的在变。

在这里插入图片描述

发现当i等于9时,arr[9]也确实变成了0,而当i再次增加变成10的时候,数组越界,而代码并没有报错,而是将arr[10]也变成了0。

在这里插入图片描述

再增加到11时,arr[11]也对应的变成了0。

在这里插入图片描述

当增加到12时,arr[12]也变成了0,循环也应该到此结束。

在这里插入图片描述

但是经调试窗口所见,i也变成了0,循环并未结束,再一次进入了循环,那么这是为什么?

在这里插入图片描述

我们把i的地址和arr[12]的地址调出来对比,发现时一样的,那么说明i和arr[12]占用的时同一块内存空间,它俩总是同时在变化。

在这里插入图片描述

这是因为栈区总是先使用高地址处的空间,再使用低地址处的空间,而数组随着下标的增长,地址是由低向高变化,所以就造成了i的地址和arr[12]的地址相同。

总结

for循环中,i的内容是从0,一直增加到12,而数组只有10个空间,因此会越界,每次访问arr数组i号位置时,都会将该位置内容设置为0,当访问到arr[12]时,也会将该位置内容设置为0,而位置恰好为i的位置,即a[12]恰巧将i设置为0,因此造成死循环。
当然这也是取决于编译器以及环境的问题,因环境而异,并不是i和arr之间一定为两个整型的空间,例如vc6.0中就没有多余的空间,gcc中有一个整形空间,所以还是因环境而异。

不足之处请各位大佬批评指正,共同交流进步!

  • 11
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值