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

堆上分配数组实现反转函数出错及动态内存释放咨询

问题分析与解决

一、反转后首元素丢失、出现垃圾值的原因

你的代码存在两个关键错误导致了该问题:

  1. 数组越界访问
    在reverseArray的循环中,output[i] = arr[5 - i];这行代码逻辑错误:当i=0时,5-i=5,而你的数组array1下标范围是0到4,访问arr[5]属于越界读取,得到的是内存中的随机垃圾值;同时,原本的arr[0](值为10)永远不会被赋值到output中——当i=4时,5-4=1,只会取到arr[1](值为20)。
    正确的写法应该是:

    output[i] = arr[4 - i];
    

    这样i从0到4时,会依次取arr[4]、arr[3]、arr[2]、arr[1]、arr[0],正好完成数组反转。

  2. 内存分配的类型不匹配
    你用malloc(sizeof(int)*5)分配内存,但数组元素类型是unsigned。虽然多数系统中int和unsigned的字节大小相同,但规范写法应该匹配元素类型,避免潜在兼容性问题:

    unsigned *output = (unsigned*) malloc(sizeof(unsigned)*5);
    

修正后的reverseArray函数:

unsigned *reverseArray(unsigned *arr)
{
    unsigned *output = (unsigned*) malloc(sizeof(unsigned)*5);

    for(unsigned i = 0; i < 5; ++i)
        output[i] = arr[4 - i];

    return output;
}

此时运行程序会输出正确的反转结果:50 40 30 20 10 。

二、动态内存的释放问题

  • 必须手动释放内存,不会自动释放:reverseArray中用malloc分配的是堆内存,堆内存的生命周期不受函数局部作用域限制——函数结束后,只是局部指针output被销毁,但它指向的堆内存仍然存在,不会自动回收。如果不手动释放,会造成内存泄漏。
  • 注意释放方式:用malloc分配的内存必须用free()释放,不能用C的delete——malloc/free是C标准库的内存管理函数,new/delete是C的操作符,两者不能混用。

所以在main函数的return 0;之前,需要添加:

free(array2);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 18:55:18