2012-02-03 80 views
1

我試圖在Xcode中編譯和運行測試C程序。該程序從文本文件中讀取5個符號並關閉它。該程序的構建成功,但是當我嘗試運行該程序時,出現錯誤:GDB:程序收到的信號:「EXC_BAD_ACCESS」圍繞fclose(in)。Xcode錯誤:「EXC_BAD_ACCESS」

#include <iostream> 
#include <unistd.h> 

int main (int argc, const char * argv[]) 
{ 
    bool b; 
    char inpath[PATH_MAX]; 
    printf("Enter input file path :\r\n"); 
    std::cin >> inpath; 
    FILE *in = fopen(inpath, "r+w"); 
    char buf[5]; 
    fread(&buf,sizeof(buf),5,in); 
    printf(buf); 
    fclose(in); 
    return 0; 
} 

這可能是什麼原因?

+1

printf輸出是否顯示正常? – 2012-02-03 19:36:23

+1

學習使用調試器是C或C++學習過程的一部分。 – 2012-02-03 19:37:06

+0

由於某種原因,printf輸出超過5個符號... – 2012-02-03 19:40:12

回答

3

啊! sizeof(buf)將返回5,所以您要求在5字節緩衝區中存儲25個字節。這將覆蓋自動存儲和破壞in

而且,當然,請注意fprint(buf)將試圖打印一個沒有終止空的緩衝區,所以它會在所讀取的內容結束時打印垃圾。

+0

謝謝,'我編輯了char buf [6];的fread(BUF,的sizeof(BUF),如圖1所示,); BUF [5] = '\ 0';的printf(BUF);和它的工作!' – 2012-02-03 19:53:01

+0

@JakeBadlands - 我從來沒有明白爲什麼'fread'被定義爲它的方式。雙倍長度的參數令人困惑和不必要,並導致許多錯誤。 – 2012-02-03 23:03:44

2

fread(&buf,sizeof(buf),5,in); 

是錯誤的:仔細閱讀man page of fread(請記住sizeof(buf)將是整個buf數組的大小)。

printf(buf); 

是錯誤的。行爲是不確定的,例如,如果buf將包含%d

您絕對應該學會使用調試器(並且使用您的編譯器啓用所有警告)。

2
fread(&buf,sizeof(buf),5,in); 

這就是說你想要讀取buf 5次,這是不正確的。

第二個和第三個參數告訴fread您想要讀取的每個元素的大小和元素的數量。