簡體   English   中英

我確定這不起作用,但確實可以

[英]I'm sure this is not supposed to work but it does

此函數用於在動態數組上重新分配一些內存。 我有lot struct lottery 我通過引用傳遞結構數組( 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;
}

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

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

free(b) ,釋放該分配,並且b*a變為無效指針。 此時, return *a具有未定義的行為。

如果您不釋放b ,那么一切都很好。 您不會泄漏內存,因為您仍然有指向它的指針:通過*a (在調用方中引用一個變量)和函數的返回值。

(另外,不要realloc() 。)

暫無
暫無

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

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