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

C语言实现数组左移一位函数运行输出异常问题排查

问题定位

你的代码一共存在4个核心错误,直接导致输出异常:

  • 数组传参退化问题:C语言中数组作为函数形参传递时,会自动退化为指向首元素的指针,你在shiftLeft函数内写sizeof(nums)拿到的不是整个数组的内存大小,是int类型指针的内存占用(32位系统为4字节,64位系统为8字节),以此计算出的size完全不是数组实际元素个数。
  • 返回值类型不匹配:你定义的函数返回值类型是int,但return nums实际返回的是数组首地址(int*类型),把指针值当作整数打印,就会输出644032这类无意义的内存地址数值,和数组内容完全无关。
  • 数组下标越界:就算size计算正确,长度为n的数组合法下标范围是0 ~ n-1,你写的nums[size] = tmp直接把值写到了数组外的内存空间,属于未定义行为,会污染其他内存数据。
  • 打印逻辑错误:你用printf("%d")直接打印返回值,就算返回值正确,也只能输出单个整数,不可能打印出整个数组的所有元素。
修正后代码
#include <stdio.h>
#define MAX_SIZE 100

// 数组传参会退化为指针,需要额外传入数组实际长度;直接修改原数组内存即可,无需返回值
void shiftLeft(int nums[], int size) {
    if (size <= 1) return; // 数组长度小于2时不需要移位,直接返回
    int i, tmp = nums[0];
    for (i = 0; i < size - 1; i++) {
        nums[i] = nums[i + 1];
    }
    nums[size - 1] = tmp; // 最后一个元素下标为size-1,修正越界问题
}

int main() {
    int numss[MAX_SIZE] = {6, 2, 5, 3};
    int actual_len = 4; // 数组实际初始化的元素个数为4
    shiftLeft(numss, actual_len);
    // 遍历打印数组所有元素
    for (int i = 0; i < actual_len; i++) {
        printf("%d ", numss[i]);
    }
    return 0;
}

运行上述代码会输出正确结果:2 5 3 6

关键注意点
  • C语言没有办法在函数内部通过传入的数组名直接获取数组总长度,所有处理数组的函数,都需要额外把数组实际长度作为独立参数传入。
  • 数组下标从0开始计数,访问数组前一定要确认下标在合法范围内,越界访问会导致各种难以排查的内存问题。
  • 如果需要打印数组内容,必须通过循环遍历逐个输出元素,不存在直接打印整个数组的格式化占位符。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 04:18:33