2017-01-22 101 views
0

這是一個函數用於重新分配動態數組上的一些內存。我輸入了struct lotterylot。我通過引用傳遞結構數組(a)和我想要的新大小(n)。我宣佈臨時陣列(b),因此我可以重新分配到a我相信這不應該工作,但它確實是

我的問題是:我在堆上創建了一些字節b = realloc()等,但如果我free(b)之前,我退出該功能它不能正常工作。如果我再次調用它b == NULL變成true,但如果我刪除free(b)它工作得很好,但我認爲這是不正確的事情,因爲我在堆上留下垃圾字節。有人可以向我解釋這個問題嗎?

lot *Enterd(lot **a, int n) { 
    lot *b = NULL; 
    b = (lot *)realloc(*a, n * sizeof(lot)); 
    if (b == NULL) { 
     printf("Memory could not be allocated for the new input.\n"); 
     return NULL; 
    } 
    *a = b; 
    free(b); 
    return *a; 
} 

回答

1

b = realloc(*a, X)釋放與*a相關聯的存儲器,並分配大小X的新的分配時,存儲在b

現在,當您執行*a = b時,*ab都會引用此新分配。

free(b)之後,該分配被釋放,並且b*a都成爲無效指針。此時return *a有未定義的行爲。

如果你沒有免費b,一切都很好。你不會泄漏內存,因爲你仍然有指向它的指針:通過*a(它引用調用者中的一個變量)和函數的返回值。

(另外,不要投realloc()

+0

謝謝湯姆·齊奇和melpomene.Why不應該我投它?在UNI我們瞭解到,realloc的返回一個void *,我們要拋棄它。 (?) – Edward

+0

@愛德華不,'malloc'和'realloc'返回一個'void *',所以你*不必*施放它。一個'void *'指針可以隱式轉換爲任何對象指針類型。另一方面,鑄造可以隱藏問題:http://c-faq.com/malloc/mallocnocast.html – melpomene

+0

我會問我的proffesor,但感謝您的反饋和幫助! – Edward

相關問題