【问题标题】:Why do I get a "realloc(): invalid old size" error when executing?为什么执行时会出现“realloc(): invalid old size”错误?
【发布时间】:2022-07-22 01:33:49
【问题描述】:

这是我在执行 .exe 文件时遇到的错误。

*** Error in `./test_bin.exe': realloc(): invalid old size: 0x00007ffc67d00cf0 ***

我不明白为什么当我按预期使用 realloc() 时会引发错误。我曾尝试在 realloc() 调用之前进行强制转换,但这也不起作用。

int main{

    double *test;
    double arr1[5] = {1.0,2.0,3.0,4.0,5.0};
    double arr2[2] = {1.0,2.0};
    int     i;


    test = (double*)malloc(5*sizeof(double));
    test = arr1;
    for(i=0;i<5;i++) printf("%lf ",test[i]);

    printf("\n");

    test = realloc(test,2*sizeof(double));
    test = arr2;
    for(i=0;i<2;i++) printf("%lf ",test[i]);
    printf("\n");
    return 0;

}

【问题讨论】:

  • 您只能重新分配从 malloc 等获得的堆指针。在test = arr 之后,您的指针现在指向堆栈上的一个数组。你不能重新分配它。
  • 您在通过覆盖test 指针分配内存后立即泄露了malloced 内存
  • test = (double*)malloc(5*sizeof(double)); test = &lt;&lt;anything other than test self-assignment&gt;&gt;. 是两行的瞬时内存泄漏。

标签: c malloc realloc


【解决方案1】:

您将从arr1(不是通过malloc() 系列分配的)转换的指针传递给realloc()。这会调用未定义的行为

您可以使用memcpy() 来复制数组的内容,而不是分配指针。

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

int main(void){

    double *test;
    double arr1[5] = {1.0,2.0,3.0,4.0,5.0};
    double arr2[2] = {1.0,2.0};
    int     i;


    test = malloc(5*sizeof(double));
    /* test = arr1; */
    memcpy(test, arr1, sizeof(arr1));
    for(i=0;i<5;i++) printf("%lf ",test[i]);

    printf("\n");

    test = realloc(test,2*sizeof(double));
    /* test = arr2; */
    memcpy(test, arr2, sizeof(arr2));
    for(i=0;i<2;i++) printf("%lf ",test[i]);
    printf("\n");
    return 0;

}

还要注意malloc() family 的转换结果是considered as a bad practice

【讨论】:

    【解决方案2】:

    这些陈述

    test = (double*)malloc(5*sizeof(double));
    test = arr1;
    

    导致内存泄漏,因为首先分配了内存并将其地址分配给指针测试,然后将指针测试重新分配给数组 arr1 的第一个元素的地址。所以分配的内存地址就丢失了。

    数组没有赋值运算符。您需要将元素从一个数组复制到另一个数组。例如

    test = (double*)malloc(5*sizeof(double));
    memcpy( test, arr1, 5 * sizeof( double ) );
    for(i=0;i<5;i++) printf("%lf ",test[i]);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-24
      • 1970-01-01
      • 2014-07-04
      • 2015-01-27
      • 1970-01-01
      • 2022-01-17
      • 1970-01-01
      相关资源
      最近更新 更多