使用指针在C语言中反转数组的技术问题求助
数组反转代码的问题修正
你的代码存在几个关键问题,导致无法正确实现数组反转:
- 非法数组声明:
int arra[] = {};在C语言中不合法,且未为反转数组分配足够存储num个元素的空间,会触发内存访问越界错误。 - 原数组越界访问:
*(arr + num)指向原数组最后一个元素的下一个位置(数组下标范围是0到num-1),属于越界访问,正确的最后一个元素应为*(arr + num - 1)。 - 循环逻辑完全错误:
for (int k = 1; k == num; k++)的条件k == num在初始k=1时就不成立,循环体根本不会执行;且循环内部每次重置j=1,无法正确填充反转数组的下标。 - 内存泄漏:通过
malloc分配的arr未释放,会造成内存泄漏。
修正后的代码
#include <stdio.h> #include <stdlib.h> int main() { int num, *arr, i; scanf("%d", &num); arr = (int *)malloc(num * sizeof(int)); if (arr == NULL) { printf("内存分配失败\n"); return 1; } for (i = 0; i < num; i++) { scanf("%d", arr + i); } // 为反转数组分配足够内存 int *arra = (int *)malloc(num * sizeof(int)); if (arra == NULL) { printf("内存分配失败\n"); free(arr); return 1; } // 从原数组末尾到开头遍历,填充反转数组 for (i = 0; i < num; i++) { arra[i] = arr[num - 1 - i]; } // 打印反转后的数组 for (i = 0; i < num; i++) printf("%d ", arra[i]); // 释放动态分配的内存,避免泄漏 free(arr); free(arra); return 0; }
关键修改说明
- 合法分配数组空间:使用
malloc为反转数组arra分配能存储num个int类型元素的空间,也可在支持C99的编译器中用变长数组int arra[num];替代动态分配。 - 正确的元素访问逻辑:通过
arr[num - 1 - i]获取原数组的倒数第i+1个元素,赋值给arra[i],实现顺序反转。 - 修复循环逻辑:用标准遍历循环覆盖所有元素,确保每个元素都被正确复制。
- 内存安全处理:增加内存分配失败的判断,并在程序结束前释放所有动态分配的内存,避免内存泄漏。
内容的提问来源于stack exchange,提问作者Sarp
相关产品推荐
相关产品推荐

