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
相关产品推荐
相关产品推荐

