2011-03-17 76 views
3

我已經看到了下面的代碼的結果有些差異:如何知道C函數是否可用?

#include <stdio.h> 
#include <malloc.h> 
#include <string.h> 

int main(void) 
{ 
char* ptr; 
ptr = (char*)malloc(sizeof(char) * 12); 
strcpy(ptr, "Hello World"); 

printf("%s\n", ptr); 
printf("FREEING ?\n"); 

free(ptr); 

printf("%s\n", ptr); 
} 

讓我解釋一下:

在第三呼叫根據不同的操作系統,我得到不同的結果給printf,在Windows gargabge caracters,沒什麼在Linux和Unix系統中打印「Hello World」。

有沒有辦法檢查指針的狀態以知道內存何時被釋放?

我覺得這種打印機制不可能一直都是可信的。

Thnaks。

問候。

+2

釋放指針並不一定會改變它指向的實際內存。 – Gabe 2011-03-17 02:22:15

回答

8

釋放後使用指針會導致未定義的行爲。

這意味着程序可能會打印垃圾,打印字符串的前一個內容,擦除硬盤驅動器,或使猴子飛出底部,仍然符合C標準。

沒有辦法查看指針並「知道內存何時被釋放」。這取決於你作爲程序員保持跟蹤。

3

簡單ansewr:你不能檢查,如果指針已經在C.已釋放不同的行爲可能是由於不同的編譯器,因爲使用指針釋放它是不確定的,你可以得到各種行爲後(包括SEGFAULT和程序終止)。

如果你想檢查你是否使用自由屬性,並且你的程序沒有內存泄漏,那麼使用Valgrind之類的工具。

5

如果您調用free(),則該函數返回時內存將被釋放。這並不意味着內存會立即被覆蓋,但是使用任何你已經調用free()的指針是不安全的。

一旦你釋放了一個指針變量,總是把nil賦給一個指針變量是個好主意。這樣,你知道非零指針可以安全使用。

+1

+1 - 當你調用'free()'時,內存被釋放。 – detly 2011-03-17 02:47:44