2012-01-03 218 views
1

下面是源代碼的一小部分,其中fclose導致錯誤?這個函數並不總是被調用,在某些特定的條件下調用這個函數。fclose導致分段錯誤?

int write_into_file (char * file_name) 
{  
    FILE * fp = NULL ; 

    if (file_name == NULL) 
    { 
     return FAIL ; 
    } 

    if ((fp = fopen (file_name , "r")) == NULL) 
    { 
     if ((fp = fopen (file_name, "w")) == NULL) 
     { 
      return FAIL ; 
     } 
    } 
    fclose (fp) ; 
    fp = NULL ; 

    return SUCESS; 

} 

我們將大小爲1024的字符緩衝區傳遞給file_name。 請誰能告訴我爲什麼fclose會導致分段錯誤?

+4

試圖通過'gdb'或'valgrind'作爲開始運行它。代碼看起來沒有什麼問題,所以你應該提供儘可能多的關於崩潰的信息。 'fclose()'似乎不太可能是真正的罪魁禍首。 – 2012-01-03 19:00:50

+1

字符緩衝區空終止?字符緩衝區是一個有效的文件名?爲什麼你打開文件閱讀,然後嘗試打開它寫入,如果失敗? – 2012-01-03 19:01:14

+0

的可能的複製[FCLOSE()導致分段錯誤](http://stackoverflow.com/questions/1443164/fclose-causing-segmentation-fault) – 2015-11-13 22:22:14

回答

4

我看不出有任何可能的方式是fclose可以在這裏造成段錯誤,我認爲你的問題在於其他地方的計劃。

這可能是可能的堆棧得到了其他地方損壞,該Bug顯示當fclose被調用。我建議你再次檢查一下你的其他源代碼,然後用調試器/內存分析器仔細觀察會發生什麼。

我可以看到,可能會導致錯誤的唯一的另一件事是file_name沒有空值終止。

+0

感謝您的答覆。是的,file_name已被空終止。我想我必須與valgrind進行覈對。 – sach 2012-01-03 19:10:29

2

沒有與FCLOSE沒有問題的()。問題可能出在您將file_name與NULL進行比較,或者可能與代碼的其他部分有關。