簡體   English   中英

為什么執行時會出現“realloc(): invalid old size”錯誤?

[英]Why do I get a "realloc(): invalid old size" error when executing?

這是我在執行從以下代碼構建的 .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;

}

realloc的文檔中(重點是我的):

重新分配給定的內存區域。 它必須先前由malloc()calloc()realloc()分配,並且尚未通過調用 free 或 realloc 釋放。 否則,結果是不確定的。

在您的情況下,這一行:

test = arr1;

使指針現在指向堆棧上的數組arr1 它不是從malloc / calloc / realloc收到的指針,因此這是未定義的行為 (UB)

此外 - 您從malloc獲得的內存塊(在將指針分配給arr1之前的 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()系列的強制轉換結果被認為是一種不好的做法

這些陳述

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]);

您的程序可以如下所示

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

int main( void )
{
    double arr1[] = { 1.0, 2.0, 3.0, 4.0, 5.0 };
    const size_t N1 = sizeof( arr1 ) / sizeof( *arr1 );
    double arr2[] = { 1.0, 2.0 };
    const size_t N2 = sizeof( arr2 ) / sizeof( *arr2 );

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

    if ( test != NULL )
    {
        memcpy( test, arr1, sizeof( arr1 ) );
        for ( size_t i = 0; i < N1; i++ )
        {
            printf( "%f ", test[i] );
        } 
        putchar( '\n' );

        double *tmp = realloc( test, sizeof( arr2 ) );

        if ( tmp != NULL )
        {
            test = tmp;

            memcpy( test, arr2, sizeof( arr2 ) );
            for ( size_t i = 0; i < N2; i++ )
            {
                printf( "%f ", test[i] );
            } 
            putchar( '\n' );
        }

        free( test );
    }
}

程序輸出為

1.000000 2.000000 3.000000 4.000000 5.000000 
1.000000 2.000000 

請注意,您需要使用中間指針來重新分配內存。 否則,如果無法成功重新分配內存,則可能再次出現內存泄漏。

printf調用中格式字符串"%lf"中的長度修飾符l是多余的,沒有任何作用,

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM