数组越界导致死循环

前言
这是我曾经遇到的一个问题,希望可以对大家有所帮助吧。

问题代码如下:

#include <stdio.h>

int main(void)
{
    int i = 0;
    int arr[3] = {1,2,3};
    
    for(i=0;i<=3;i++)
    {   
        arr[i] = 0;
        printf("Hello World!\n");
    }   

    return 0;
}

执行现象:不停地打印Hello World!
程序运行结果图
原因分析
for的循环控制表达式一直为真,即i<=3一直成立,猜想一定是某个地方修改了变量i的值

查找错误原因的代码
下面打印变量i和数组各元素的地址。

#include <stdio.h>

int main(void)
{
    int i = 0;
    int arr[3] = {1,2,3};

    printf("&i = %p\n",&i);
    printf("&arr[0] = %p\n",&arr[0]);
    printf("&arr[1] = %p\n",&arr[1]);
    printf("&arr[2] = %p\n",&arr[2]);
    printf("&arr[3] = %p\n",&arr[3]);
    for(i=0;i<=3;i++)
    {
    //  arr[i] = 0;
        printf("Hello World!\n");
    }

    return 0;
}

程序执行结果如下
在这里插入图片描述

不难发现,变量i的地址与arr[3]的地址相同,所以当我们在for循环里面改变arr[3]的值时,实际就是改变了变量i的值。
那为什么arr[3]的地址就是变量i的地址呢?因为局部变量是存放在栈中的,栈的生长方向是从高到低,由于局部变量i最先定义,所以它占据较高的栈空间地址,而数组后定义,所以数组的地址比变量i的低。数组元素的地址是随着下标变大逐渐增大的,所以当我们去越界访问arr[3]时,实际是访问了变量i。

高地址 | i | a[2] | a[1] | a[0] | 低地址

避免死循环的方法
1 先定义数组,再定义变量i。

#include <stdio.h>

int main(void)
{
//  int i = 0;
    int arr[3] = {1,2,3};
    int i = 0;

    printf("&i = %p\n",&i);
    printf("&arr[0] = %p\n",&arr[0]);
    printf("&arr[1] = %p\n",&arr[1]);
    printf("&arr[2] = %p\n",&arr[2]);
    printf("&arr[3] = %p\n",&arr[3]);
    for(i=0;i<=3;i++)
    {   
        arr[i] = 0;
        printf("Hello World!\n");
    }   

    return 0;
}

在这里插入图片描述
2 最最重要的是尽量避免越界访问数组。

总结
数组越界导致死循环的原因是数组越界刚好更改了i的值。

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

⁽⁽ଘ晴空万里ଓ⁾⁾

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

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

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

打赏作者

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

抵扣说明:

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

余额充值