2014-04-13 99 views

回答

3

您應該使用標準庫函數realloc。顧名思義,它重新分配了一塊內存。其原型(包含在頭部stdlib.h

void *realloc(void *ptr, size_t size); 

的函數改變所述存儲器塊的指向ptrsize字節大小。該內存塊必須由malloc,realloccalloc調用分配。需要注意的是,realloc可能會將舊塊擴展爲size字節,可能會保留相同的塊並釋放額外的字節,或者可能會分配一個全新的內存塊,將內容從較舊的塊複製到較新的塊,以及然後free舊的塊。

realloc返回一個指向重新分配的內存塊的指針。如果它不能重新分配內存,那麼它將返回NULL,並保持原始內存塊不變。因此,在調用realloc之前,應將ptr的值存儲在臨時變量中,否則原始內存塊將丟失並導致內存泄漏。此外,你應該不投的malloc結果 - Do I cast the result of malloc?

// allocate memory for 10 integers 
int *arr = malloc(10 * sizeof *arr); 
// check arr for NULL in case malloc fails 

// save the value of arr in temp in case 
// realloc fails 
int *temp = arr; 

// realloc may keep the same block of memory 
// and free the memory for the extra 5 elements 
// or may allocate a new block for 5 elements, 
// copy the first five elements from the older block to the 
// newer block and then free the older block 
arr = realloc(arr, 5 * sizeof *arr); 
if(arr == NULL) { 
    // realloc failed 
    arr = temp; 
} 
+0

清晰明瞭的解釋...謝謝兄弟 – Arjun

3

您可以使用標準c庫提供的realloc函數。

C99標準7.20.3.4-1:本realloc函數:

的realloc函數將釋放舊的對象通過ptr指向和 指針返回到具有尺寸SPECI音響編一個新的對象按尺寸。新對象的內容應與釋放前的舊對象的內容相同,最大爲新舊對象的最小值。新對象中超出舊對象大小的任何字節都有不確定的值。

+2

我認爲這是值得注意''realloc'不一定會釋放部分內存''malloc';它可能會選擇分配一個新塊,複製相關數據並釋放整個舊塊。 – sapi

+0

@sapi:對。標準報價清楚地表明瞭這一點(*用粗體*標註) –