为何执行程序时会出现realloc(): invalid old size错误?
问题分析与解决
错误根源
- 核心问题:
realloc只能操作堆内存分配的指针(也就是malloc/calloc/realloc返回的指针),但你调用realloc前,已经把test指向了栈上的数组arr1,这直接触发了非法内存操作。 - 具体流程拆解:
- 你先用
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
相关产品推荐
相关产品推荐

