You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言数组左移程序报错,求问题原因分析及修复方案

C语言数组左移代码的问题分析与修复

问题分析

你的代码存在三个核心问题:

  • 循环条件完全错误:i < arr中,数组名arr会被隐式转换为数组首元素的地址(一个整数),和循环变量i的数值比较没有任何意义,根本无法正确控制遍历次数。
  • 数组越界访问:原循环会遍历到数组的最后一个元素,此时arr[i+1]会访问数组范围外的内存,这属于未定义行为,会导致程序崩溃或输出异常结果。
  • 左移逻辑的循环次数错误:实现数组左移一位时,只需要覆盖前n-1个元素(n为数组长度),最后一个元素不需要执行覆盖操作(否则会触发越界)。

修复方法与代码

首先需要正确获取数组长度,再调整循环逻辑,修复后的代码如下:

#include <stdio.h>

int main()
{
    int arr[] = {1,5,7,10};
    // 计算数组元素个数:总字节数除以单个元素字节数
    int len = sizeof(arr) / sizeof(arr[0]);
    
    // 左移一位:仅遍历前len-1个元素,避免越界
    for (int i = 0; i < len - 1; i++)
    {
        arr[i] = arr[i+1];
    }
    // 可选:如果需要左移后最后一位补0,取消下面注释
    // arr[len-1] = 0;
    
    // 正确遍历数组打印结果
    for (int i = 0; i < len; i++)
    {
        printf("Arr[%d] = %d\n", i, arr[i]);
    }
    
    return 0;
}

关键修复点说明

  1. 获取数组长度:使用sizeof(arr)/sizeof(arr[0])是C语言中在数组定义的作用域内获取元素个数的标准方式,能自动适配不同类型和长度的数组。
  2. 调整循环次数:第一个循环条件改为i < len - 1,确保i+1始终指向数组的合法下标,避免越界访问。
  3. 合法的元素覆盖:arr[i] = arr[i+1];本身是合法的内存操作,只要保证访问的下标在数组范围内,就能安全地完成左移逻辑。

内容的提问来源于stack exchange,提问作者Luness

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 16:42:42