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

为何执行程序时会出现realloc(): invalid old size错误?

问题分析与解决

错误根源

  • 核心问题:realloc只能操作堆内存分配的指针(也就是malloc/calloc/realloc返回的指针),但你调用realloc前,已经把test指向了栈上的数组arr1,这直接触发了非法内存操作。
  • 具体流程拆解:
    1. 你先用malloc分配了堆内存给test,但紧接着执行test = arr1;,把栈数组的地址覆盖了test的值——这不仅让之前malloc的内存彻底泄漏,还让后续realloc去操作栈内存指针,完全违反realloc的使用规则,必然报错。

代码修正方案

如果你的需求是先使用arr1的内容,再重新分配内存使用arr2的内容,正确写法如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() { // 修正main函数的语法错误,原代码少了括号
    double *test = NULL;
    double arr1[5] = {1.0,2.0,3.0,4.0,5.0};
    double arr2[2] = {1.0,2.0};
    int i;

    // 分配堆内存并复制arr1的内容
    test = malloc(5 * sizeof(double));
    if (test == NULL) { // 必须检查内存分配是否成功
        perror("malloc failed");
        return 1;
    }
    memcpy(test, arr1, 5 * sizeof(double));
    for(i=0; i<5; i++) printf("%lf ", test[i]);
    printf("\n");

    // 重新分配内存,先存临时指针避免内存泄漏
    double *temp = realloc(test, 2 * sizeof(double));
    if (temp == NULL) {
        perror("realloc failed");
        free(test); // 分配失败时要释放原内存
        return 1;
    }
    test = temp;
    memcpy(test, arr2, 2 * sizeof(double));
    for(i=0; i<2; i++) printf("%lf ", test[i]);
    printf("\n");

    free(test); // 最后释放堆内存,避免泄漏
    return 0;
}

额外注意点

  • 绝对不能用栈数组的指针调用realloc,这属于未定义行为,轻则报错重则程序崩溃。
  • 调用malloc/realloc后必须检查返回值是否为NULL,防止空指针操作。
  • 用realloc时别直接用原指针接收返回值——如果分配失败,原指针会被覆盖成NULL,导致原有内存泄漏,必须先用临时指针接收。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 14:15:39