我將給定類型的指針傳遞給函數。 在功能我分配所需的內存:分配了malloc或calloc的內存是否在函數結束時被釋放了?
Pointer = (mytype *) malloc (N* sizeof (mytype));
而這一切都進展順利。函數結束後另一個調用指針。
但是之前填充的指針現在沒有內存。
不應該指針保持它的填充內存?
或者函數的結尾會釋放內存嗎?
對不起,但我無法粘貼我的代碼,因爲我工作在未連接的PC上。
我將給定類型的指針傳遞給函數。 在功能我分配所需的內存:分配了malloc或calloc的內存是否在函數結束時被釋放了?
Pointer = (mytype *) malloc (N* sizeof (mytype));
而這一切都進展順利。函數結束後另一個調用指針。
但是之前填充的指針現在沒有內存。
不應該指針保持它的填充內存?
或者函數的結尾會釋放內存嗎?
對不起,但我無法粘貼我的代碼,因爲我工作在未連接的PC上。
不,但你沒有返回指向調用者的指針。函數內部的參數與調用站點的值不同,因此通過指定malloc()
的返回值來更改它不會更改調用方的值。
此:
Foo *foo;
AllocateAFoo(foo);
沒有機會後函數返回改變foo
價值,即使參數被分配到函數內部。這就是爲什麼malloc()
返回的新值。
你需要做的也:
mytype * Allocate(size_t num)
{
return malloc(num * sizeof (mytype));
}
這意味着,在發送從呼叫者的功能未初始化的指針是沒有意義的,所以不要。
另外,you shouldn't cast the return value of malloc()
in C。
此外,你需要知道malloc()
只是一個像其他任何功能。如何你編寫一個函數,當執行離開其他功能時作出反應?答案當然是「你不能」,因此malloc()
也不能。
否。由malloc分配的內存不會在函數結束時解除分配。
否則,這將是一場災難,因爲您將無法編寫一個函數,該函數通過爲其分配內存,填充數據並將其返回給調用者來創建數據結構。
這正是我的想法,但通過調試我的程序似乎它是...怪異的 – Wing
@Wing,不要混淆本地句柄(指針),當它超出範圍清理的內存,與內存本身被回收。 – StoryTeller
我編輯了你的答案,使之更加清晰。希望我沒有改變意思。 – tangrs
您可以使用alloca(),但並不是所有的體系結構都支持這一功能。
**否**如果沒有處理,則稱爲內存泄漏... –
如果指針內容消失,則存在另一個錯誤。但沒有代碼,我們不會知道。 – Evert
標準免責聲明:[不要在C中投入'malloc'的結果(http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc)。 –