C语言数组越界造成的死循环例子,当你得到了这个意想不到的结果的时候,你肯定不知道为什么,看你还敢不敢越界访问数组了

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 bit\n");
    }
    return 0;
}

大家可以看到,这个看似简单的代码,一眼看上去这段代码存在的错误就是数组越界访问了,但是越界访问一般都是程序直接崩溃的,但是这里居然是死循环的一个结果,这是什么原因呢?相信绝大部分C语言的初学者是看不出来原因的,包括一部分的对C语言比较熟手的同学也不知道这是个什么原因,那我们今天就来研究研究它到底是什么原因导致死循环。

对于运行时错误,我们只能通过调试的方法试着找找原因了。

在调试时你会发现arr[12]的值和i的值始终相等,当i=12的时候,再按一次F10,你会发现i的值又变回了0,如上图所示,原来原因就在这里,每次当i=12的时候arr[12]被改成0的同时i又被改成0了,所以i<=12恒成立,也就是说这个循环无法跳出,所以造成了死循环,但是为什么改变arr[12]的值的时候i会跟着改变呢?难道它们两个的地址相同的?答案是肯定的。确实它们都地址是相同的。结合以下这张图理解你就懂了。

由于i变量是先创建的 ,而数组是后创建的,所以i在高地址,arr在低地址,而在VS编译器底下i刚好是数组arr下标为12的元素的位置,所以当访问到arr[12]的时候刚好访问到i,所以i也被改成了0,就导致的死循环了,所以数组越界访问真的会造成你意想不到的结果的,你以后还敢越界访问数组吗?

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值