2012-05-29 45 views
1

我遇到了這個奇怪的問題。基本上,我有一個循環,永遠循環,在循環的開始,我打開一個文件,我寫了一些東西的文件,然後在循環結束我關閉文件。工作正常循環的第一次迭代,但在第二次迭代,我得到該指針如何在同一時間爲空而不爲空?

*** glibc detected *** ./prog: double free or corruption (top): 

循環的第二次迭代期間,我已經縮小下來到fclose(data)線。顯然這個錯誤發生在你不止一次釋放某些東西的時候,但是在這段代碼中怎麼可能呢?

while(1) 
{ 
    if (data == NULL) 
    { 
     data = fopen(data_path, "w+"); 
    } 

    /* do a bunch of stuff... */ 

    if (data != NULL) 
    { 
     fclose(data); 
    } 
} 

陌生人的事情是,如果我fclose(data)後添加以下行的程序運行得很好,沒有任何問題:

data = NULL; 

可別人誰是更好地精通用C比我解釋一下這是怎麼回事在這?

+1

用valgrind運行你的程序,它會自動告訴你它有什麼問題。 –

+1

在'data'上調用'fclose'不會*使數據變成NULL指針;實際上,它不會(也不能)根本改變'數據'*的值。它所做的是導致不再是數據指向的內存位置的FILE對象。 – zwol

回答

9

fclose不會使文件指針爲NULL。 它只需關閉文件。 因此,在第二次迭代中,文件未打開,因爲數據不是NULL。

+0

啊..好的,這是有道理的。但在我的主循環中,我正在使用fprintf多次寫入文件指針,如果我正在嘗試寫入已關閉的文件指針,fprintf是不是應該抱怨? – user1419670

+0

你應該檢查fprintf的返回值。另外,fprintf不知道文件是否關閉。它只是試圖將字符轉儲到文件指針。 – Superman

+0

好的感謝使完美的感覺 – user1419670