2011-03-21 99 views
5

理解概念嘗試下面的代碼:的免費

#include<stdio.h> 
int main() 
{   
     int *p,*q; 
     p = (int *)malloc(sizeof(int)); 
     *p =10; 
     q = p; 
     printf("%u \n",p); 
     printf("%u \n",q); 
     free(p); 
     printf("%u \n",p); 
     return 0; 
} 

輸出得到如下:

[[email protected] Tazim]# ./a.out 
154804232 
154804232 
154804232 

爲什麼裏面p該地址仍然是印刷,即使我做了free(p);free(p)做了什麼?

我想明白地理解free/malloc的概念。任何幫助都是有價值的。

回答

5

free()只釋放堆上的內存。它不會改變你的指針的值。如果你試圖打印指針指向的內存,你會可能得到某種垃圾。

此外,當您叫free,你給它的指針,而不是地址指針,所以free不能改變你的指針......

+0

這是真的,但打印指針值仍然是未定義的行爲 - http://stackoverflow.com/q/4076563/57428 – sharptooth 2011-03-21 12:06:38

+0

@sharptooth - 謝謝。不知道 – MByD 2011-03-21 12:11:58

3

這是不確定的行爲 - 一旦你free d的指針存儲的地址變爲無效,你can't do anything with it - 不僅你不能解引用它,但你甚至不能printf()指針值。

+0

這在技術上並不能解答問題。 – 2011-03-21 12:18:04

+0

@JUST我的正確觀點:它確實 - 一旦你完成了free()'你不能打印地址 - 它可以產生任何結果。 – sharptooth 2011-03-21 12:22:05

+0

問題是:「爲什麼p裏面的地址仍然是打印的,即使我已經完成了免費(p);什麼是免費的(p)完成?想明白free/malloc的概念。」你沒有回答任何一部分。 – 2011-03-21 12:26:39

2

正在打印的指針,即該地址內存區域分配給你ints。釋放一個帶有free的內存區域並不會像我想象的那樣將指針的地址設置爲0x00。

它只是告訴操作系統,內存區域再次可用,以備將來重複使用。

如果您在free(p)之後打印*p,則會出現問題。

+0

你應該編輯你的答案,並刪除「打印p很好......」,因爲它是未定義的行爲。 – Jens 2011-04-13 11:27:09

+0

只是做到了,謝謝。 – Sylvain 2011-04-13 16:59:27

0

記住:指針只不過是一個地址。之前,你的malloc之後,或者免費的,它會給你同樣的結果。 malloc()所做的唯一事情就是在這個地址保留空間。唯一免費的是釋放它(最有可能的是,將此地址標記爲可用於存儲其他內容,「清理」將非常耗時)。 這就是爲什麼免費後你的指針指向NULL是個好主意;因爲你可以確定指針是否連接到某個東西。

+0

'malloc()'不會在它返回的地址存儲任何內容。 – 2011-03-21 12:09:00

+0

錯誤......也許這是我的英語爛了。 「儲存」和「預留空間」之間有什麼不同? – Raveline 2011-03-21 12:14:13

+0

預留空間意味着告訴內存管理系統「不要把這個內存給別人」。存儲意味着實際上將一些價值放入該空間。 – 2011-03-21 12:17:33

1

malloc()及其在內存存儲區域中的同名空間稱爲「堆」並返回指向該保留區域的指針。因此,在上面的示例中,p被指定了一個指針,可能是一個保留供其使用的4字節內存區域(其地址恰好爲154804232)。當您執行*p = 10時,您現在將整數值10放入指向的內存中。當您執行q = p時,您現在正在使q指向相同的保留堆內存塊。

free()之流只是無法保留的內存。當你打電話給free()時,你會說「我不會再用這個記憶了」。所有free()確實告訴內存管理系統,內存塊現在可以再次使用。 它着重做不是改變你的指針。這只是表示內存塊可用。之後,由您來確保您不再使用該指針。

如果您再次使用該指針,它可能會正常工作。一旦。或兩次。或者一千次。它基本上可以正常工作,直到在別人聲稱你所說的內存塊是免費的並且對它做了某些事情之後使用它爲止。當發生,壞事發生< tm>。請不要讓不好的事情發生。

0

free does not reassign the pointer指向別的東西。實際上,C標準 沒有提及任何指針的操作。這是所有在說明中說:

的免費功能使可用於進一步 分配的空間 ptr指向要被釋放, 就是製造。如果ptr是空指針,則不會發生任何操作。否則,如果 參數不匹配的指針 早些時候釋放calloc, malloc或realloc函數返回,或者如果 空間已經通過調用 釋放釋放或realloc,該行爲是 不確定