我用malloc在c中創建一個動態數組。 如:釋放一個指向動態數組的指針c
myCharArray = (char *) malloc(16);
現在,如果我做這樣的函數,並通過myCharArray它
:
reset(char * myCharArrayp)
{
free(myCharArrayp);
}
將
的工作,或將我莫名其妙地只釋放指針(myCharArrayp)的副本,不是真正的myCharArray?
我用malloc在c中創建一個動態數組。 如:釋放一個指向動態數組的指針c
myCharArray = (char *) malloc(16);
現在,如果我做這樣的函數,並通過myCharArray它
:
reset(char * myCharArrayp)
{
free(myCharArrayp);
}
將
的工作,或將我莫名其妙地只釋放指針(myCharArrayp)的副本,不是真正的myCharArray?
這樣可以很好地釋放你想要的內存。
我會考慮這樣的指針被釋放後設置爲NULL寫一個函數像
void reset(char** myPointer) {
if (myPointer) {
free(*myPointer);
*myPointer = NULL;
}
}
。重複使用先前釋放的指針是錯誤的常見原因。
您需要明白指針只是一個存儲在堆棧中的變量。它指向一個內存區域,在這種情況下,分配在堆上。您的代碼可以正確釋放堆上的內存。當你從你的函數返回時,指針變量就像任何其他變量(例如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.
感謝您的好解釋。 – Henrik 2011-03-18 10:16:19
感謝這個很好的解釋,詳細說明了從頭部和堆棧中釋放內存的差異。對我來說,如果< - 被替換爲//,那麼源代碼的着色會更好,因此更容易閱讀。 – 2013-05-03 10:35:35
是的,它會工作。
雖然您的指針變量的副本將被髮送,但它仍然會引用正確的內存位置,這將在免費調用時釋放。
通常我正在做一些代碼的審查,所以我的例子是一個簡化版本。在實際的代碼中有另一行代碼:myCharArrayp = NULL;我知道這是行不通的。但後來我開始懷疑免費是否也不行。我想這一切都必須按照你的建議重寫。感謝:o) – Henrik 2011-03-18 10:03:51
喬的回答很好地解釋了它。指針是一個存儲在堆棧中的變量,函數獲取一個副本。這就是爲什麼你需要一個指向上面例子中的指針的原因。 – 2011-03-18 10:04:44
是的,你需要一個'char **'(或'void **'),但爲什麼不在代碼中調用'free'之後只給'指針指定'NULL?引用:「如果ptr是一個NULL指針,則不執行任何操作。」所以我會說這個功能有點浪費! – Joe 2011-03-18 10:25:53