2010-12-06 54 views
2
typedef struct { 

    unsigned char b1, b2; 

} cont; 

cont buf[1024]; 

int main(int argc, char *argv[]) { 

     FILE* fp; 

     fp = fopen(argv[1], "rb") 

     if(fp!=NULL) 

      fread(buf, sizeof (cont), sizeof (buf), fp); 

      //do something with buf 
      return 0; 

} 

你好,我在嘗試運行這個程序時遇到了分段錯誤錯誤。它曾經工作得很好,所有的突然的segm。出現錯誤錯誤。 fread函數調用正在產生錯誤。請幫幫我!fread出現分段錯誤。幫幫我!

+0

程序不會停止這樣工作。你改變了什麼?新的編譯器版本?還有別的嗎? – 2010-12-06 10:13:12

+0

沒什麼,我使用的Windows平臺上NetBeans IDE和我使用在緩衝元件的cygwin克++編譯器 – user532053 2010-12-06 10:16:11

+0

第三參數應該是數(它是1024),而不是它以字節爲單位的大小(這是的sizeof(BUF)) – 2010-12-06 10:22:35

回答

0

總是檢查返回值。你還知道如果你真的設法讀取任何東西嗎?

我想這可能是因爲填充。 「cont」類型被定義爲2字節大,但可能會被填充到4.但是這不應該引起問題,因爲即使sizeof(cont)返回2或4,「buf」必須使用填充的大小,因此仍然夠大。

3

您正在使用fread()錯誤 - arg#1是要讀取的元素的大小,而arg#2是要讀取的元素的數量(在您的情況下應爲1024)。

因此,你所做的讀取sizeof (cont) * sizeof (buf)字節,並且溢出緩衝區。

請參見:

http://www.opengroup.org/onlinepubs/009695399/functions/fread.html

的函數文檔。

爲了澄清,您希望讀取1024個元素,但sizeof(buf)是2048(至少,如果結構由平臺的ABI填充,則可能更多)。

例(編碼,使得它們不依賴於元件的具體數目):

fread(buf, 1, sizeof(buf), fp); // fills the buffer (assuming it's buf[...]) 
fread(buf, sizeof(*buf), sizeof(buf)/sizeof(*buf), fp); // ditto 

即如果要通過sizeof()傳遞目標緩衝區的總大小,則另一個參數必須爲1,而如果要傳遞數據結構的大小,那麼另一個參數是適合這些參數的數量緩衝。

0

sizeof(buf)給你buf的總數,而不僅僅是它的元素數量。儘管如此,你永遠不應該直接讀入結構。如果你這樣做,壞事就等着你。

也可以在其成員之間的任何位置填充結構,因此您甚至不知道您定義的結構的確切內存佈局。

爲了保持程序的可移植性和安全性,請始終按元素逐個讀取文件並從中構建數據。

int i; 
for(i = 0; i < MAX_ELEMENTS && !feof(fil); ++i) { 
    int c1, c2; 
    c1 = fgetc(fil); 
    c2 = fgetc(fil); 

    if(c1 == EOF || c2 == EOF) 
     break; 

    buf[i].c1 = c1; 
    buf[i].c2 = c2; 
} 

這看起來乏味而冗長嗎? 是的,但這是很有道理的。始終假定文件的內容可能已損壞。只是將文件讀入內存假定是危險