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

使用指针在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;
}

关键修改说明

  1. 合法分配数组空间:使用malloc为反转数组arra分配能存储num个int类型元素的空间,也可在支持C99的编译器中用变长数组int arra[num];替代动态分配。
  2. 正确的元素访问逻辑:通过arr[num - 1 - i]获取原数组的倒数第i+1个元素,赋值给arra[i],实现顺序反转。
  3. 修复循环逻辑:用标准遍历循环覆盖所有元素,确保每个元素都被正确复制。
  4. 内存安全处理:增加内存分配失败的判断,并在程序结束前释放所有动态分配的内存,避免内存泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 05:58:36