2012-05-07 82 views
-4
void* heap = malloc(100); 
char *c = heap; 
strcpy(c, "Terence"); 
printf("heap = %s\n", heap); 
free(heap); 
heap = malloc(100); 
printf("heap = %s\n", heap); 

輸出爲:dynamiclly分配和釋放用C

heap = Terence 
heap = 

這就是我的期望,但現在我有一個更爲複雜的代碼,結構類似於上述情況,但輸出是這樣的:

heap = "Terence" 
heap = " ren " 

類似的東西。

它似乎堆沒有被清理?

有沒有辦法解決它?

回答

7

malloc分配的內存區域內有一個不確定的初始值。

從C標準(重點煤礦):爲一個對象,其大小由大小和其值指定

(C99,7.20.3.3p2)「malloc函數分配空間是不確定* 「。

使用callocmallocmemset有一個確定的值。

+0

或者,對於字符串的緩衝區,只需將第一個字節設置爲零即可。 –

3

Malloc不會隱式地將分配的內存清零。您需要細胞要麼釋放calloc或memset的用於此目的:

heap = malloc(100); 
memset(heap, 0, 100); 

heap = calloc(100, 1); 
0

釋放任何內存塊時,應始終將指針變量設置爲NULL,因爲內存不再可訪問。

0

當您使用void free(void* ptr);釋放先前分配的內存塊時,可以使用指針變量作爲free函數的參數。該函數只讀取指針變量,並且不會自動將其設置爲NULL。

因此,您需要將該變量設置爲NULL,以便其他已編寫的代碼(可能取決於該變量)將處理NULL指針,而不是看起來不錯的內存地址,但指向無法再訪問的內存。