2015-10-01 68 views
1

我將給定類型的指針傳遞給函數。 在功能我分配所需的內存:分配了malloc或calloc的內存是否在函數結束時被釋放了?

Pointer = (mytype *) malloc (N* sizeof (mytype)); 

而這一切都進展順利。函數結束後另一個調用指針。

但是之前填充的指針現在沒有內存。

不應該指針保持它的填充內存?

或者函數的結尾會釋放內存嗎?

對不起,但我無法粘貼我的代碼,因爲我工作在未連接的PC上。

+1

**否**如果沒有處理,則稱爲內存泄漏... –

+1

如果指針內容消失,則存在另一個錯誤。但沒有代碼,我們不會知道。 – Evert

+7

標準免責聲明:[不要在C中投入'malloc'的結果(http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc)。 –

回答

2

不,但你沒有返回指向調用者的指針。函數內部的參數與調用站點的值不同,因此通過指定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()也不能。

3

否。由malloc分配的內存不會在函數結束時解除分配。

否則,這將是一場災難,因爲您將無法編寫一個函數,該函數通過爲其分配內存,填充數據並將其返回給調用者來創建數據結構。

+0

這正是我的想法,但通過調試我的程序似乎它是...怪異的 – Wing

+0

@Wing,不要混淆本地句柄(指針),當它超出範圍清理的內存,與內存本身被回收。 – StoryTeller

+0

我編輯了你的答案,使之更加清晰。希望我沒有改變意思。 – tangrs

0

您可以使用alloca(),但並不是所有的體系結構都支持這一功能。

相關問題