2017-08-15 194 views
-1

我想使用realloc,因爲我想提高代碼中的速度。當某個條件滿足時,我想將一個無效雙指針重新分配給一個更大的大小,但是我得到了一個分段錯誤。這是代碼。C - 在指針上使用realloc指針導致分段錯誤

if (p_bheap->currentSize == p_bheap->arraySize){ 
    p_bheap->arraySize = p_bheap->arraySize*2 + 1; 
    p_bheap->pp_array = realloc(p_bheap->pp_array, p_bheap->arraySize); 
} 

但是這會導致分段錯誤。如果我然而讓我自己的重新分配功能,它的作品。

if (p_bheap->currentSize == p_bheap->arraySize){ 
    p_bheap->pp_array = bheap_reallocate(p_bheap); 
} 

void** bheap_reallocate(bheap* p_bheap){ 
    p_bheap->arraySize = p_bheap->arraySize*2 + 1; 
    void** pp_newArray = malloc(p_bheap->arraySize*sizeof(void*)); 
    for (int i = 0; i < p_bheap->currentSize; i++){ 
     pp_newArray[i] = p_bheap->pp_array[i]; 
    } 
    free(p_bheap->pp_array); 
    return pp_newArray; 
} 

是否有任何明顯的錯誤可以發現,我沒有看到?對於那些想知道我正在編程一個二進制堆的人來說。

+5

傳遞到大小['realloc'](http://en.cppreference.com/w/c/memory/realloc)就像傳遞到['malloc']的大小(HTTP ://en.cppreference.com/w/c/memory/malloc):***字節中的大小***(不是元素)。 –

+4

順便說一句,不要將['realloc'](http://en.cppreference.com/w/c/memory/realloc)的結果指定回作爲參數傳遞的指針。如果['realloc'](http://en.cppreference.com/w/c/memory/realloc)失敗,它將返回'NULL',你將失去原始的指針並且有內存泄漏。 –

+0

我沒有完全理解你的解決方案。我必須改變什麼? –

回答

-1

您不能使用相同的內存空間來接收結果。嘗試使用臨時數組或分配另一個空間。

+0

沒有陣列。只是指針。 –

+2

這是* a *問題,但它不是OP所具有的*問題。 –

0

如果您有以前分配的對象(例如str),並且想要將其內存調整爲其他大小,請使用臨時變量來防止realloc失敗時的內存丟失。插圖:

char *str = calloc(20, 1); 
if(str) // should always check return of calls to [c][m][re]alloc. 
{ // at this point, str owns 20 bytes of memory. If you use str in a subsequent 
    // call to realloc, and the call fails, then the memory previously allocated in 
    // the original call to calloc() will be lost. (memory leak). 
.... 
char *tmp = {0};//So instead, use a temporary variable to accept memory 
       //and provide a way to recover if allocation fails 

tmp = realloc(str, 40);//newsize (40) in bytes 
if(!tmp) //test reallocation 
{ 
    //reallocation failed. 
    //free previously allocated memory, and decide how to proceed. 
    //In this case, return a NULL, and let the calling function decide. 
    free(str);//if allocation fails, free the previous object and leave 
    return NULL; 
} 
//reallocation succeeded. Proceed normally 
str = tmp;//reallocation succeeded, assign its address to str and proceed normally