[英]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.