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

C语言数组反转程序输出随机大数,求问题排查

数组反转代码的错误排查与修复

你的代码核心问题是反转数组时的索引计算错误,导致访问了数组边界外的内存,出现随机垃圾值。

错误分析

在复制反转元素的循环中,你写了:

*(ptr2 + i) = *(ptr + sizeArray - i + 1 );

C语言数组下标从0开始,长度为sizeArray的数组,有效下标范围是0到sizeArray-1。当i=0时,ptr + sizeArray - 0 +1等价于ptr + sizeArray +1,这已经超出了原数组的有效内存区域,读取到的是内存中未初始化的随机值(也就是你看到的897546457)。

正确的对应逻辑是:新数组的第i个元素,对应原数组的第sizeArray - 1 - i个元素。比如输入数组长度为4时:

  • 新数组第0位 → 原数组第3位(4-1-0=3)
  • 新数组第1位 → 原数组第2位(4-1-1=2)
    以此类推,完全匹配数组反转的需求。

修复后的代码

只需修改复制循环中的赋值语句即可:

#include <stdio.h>
#define MAX_SIZE 100
int main()
{
    int sizeArray;
    int arr[MAX_SIZE];
    int * ptr = arr;
    printf("Enter Array size: ");
    scanf("%d", &sizeArray);
    printf("Enter Array elements:\n");
    for (int i = 0; i < sizeArray; i++)
    {
        scanf("%d", ptr + i);
    }
    printf("Copying to another array....\n");
    
    int newArr[MAX_SIZE];
    int * ptr2 = newArr;
    for (int i = 0; i < sizeArray; i++)
    {
        // 修正索引计算逻辑
        *(ptr2 + i) = *(ptr + sizeArray - 1 - i );
    }
    printf("Printing new array:\n");
    for (int i = 0; i < sizeArray; i++)
    {
        printf("%d\n", *(ptr2 + i));
    }
    return 0;
}

额外建议

  • 可以添加输入校验,确保sizeArray在1到MAX_SIZE之间,避免非法输入导致的数组越界问题。
  • 如果觉得指针写法不够直观,也可以直接用数组下标访问,比如newArr[i] = arr[sizeArray -1 -i],逻辑完全一致,可读性可能更好。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 17:35:17