2011-03-18 130 views
3

我用malloc在c中創建一個動態數組。 如:釋放一個指向動態數組的指針c

myCharArray = (char *) malloc(16); 
現在,如果我做這樣的函數,並通過myCharArray它

reset(char * myCharArrayp) 
{ 
    free(myCharArrayp); 
} 

的工作,或將我莫名其妙地只釋放指針(myCharArrayp)的副本,不是真正的myCharArray?

回答

7

這樣可以很好地釋放你想要的內存。

我會考慮這樣的指針被釋放後設置爲NULL寫一個函數像

void reset(char** myPointer) { 
    if (myPointer) { 
     free(*myPointer); 
     *myPointer = NULL; 
    } 
} 

。重複使用先前釋放的指針是錯誤的常見原因。

+0

通常我正在做一些代碼的審查,所以我的例子是一個簡化版本。在實際的代碼中有另一行代碼:myCharArrayp = NULL;我知道這是行不通的。但後來我開始懷疑免費是否也不行。我想這一切都必須按照你的建議重寫。感謝:o) – Henrik 2011-03-18 10:03:51

+0

喬的回答很好地解釋了它。指針是一個存儲在堆棧中的變量,函數獲取一個副本。這就是爲什麼你需要一個指向上面例子中的指針的原因。 – 2011-03-18 10:04:44

+2

是的,你需要一個'char **'(或'void **'),但爲什麼不在代碼中調用'free'之後只給'指針指定'NULL?引用:「如果ptr是一個NULL指針,則不執行任何操作。」所以我會說這個功能有點浪費! – Joe 2011-03-18 10:25:53

14

您需要明白指針只是一個存儲在堆棧中的變量。它指向一個內存區域,在這種情況下,分配在堆上。您的代碼可以正確釋放堆上的內存。當你從你的函數返回時,指針變量就像任何其他變量(例如int)一樣被釋放。

void myFunction() 
{ 
    char *myPointer;  // <- the function's stack frame is set up with space for... 
    int myOtherVariable; // <- ... these two variables 

    myPointer = malloc(123); // <- some memory is allocated on the heap and your pointer points to it 

    free(myPointer); // <- the memory on the heap is deallocated 

} // <- the two local variables myPointer and myOtherVariable are freed as the function returns. 
+0

感謝您的好解釋。 – Henrik 2011-03-18 10:16:19

+1

感謝這個很好的解釋,詳細說明了從頭部和堆棧中釋放內存的差異。對我來說,如果< - 被替換爲//,那麼源代碼的着色會更好,因此更容易閱讀。 – 2013-05-03 10:35:35

1

是的,它會工作。

雖然您的指針變量的副本將被髮送,但它仍然會引用正確的內存位置,這將在免費調用時釋放。