2013-04-11 79 views
1

該程序工作時,
它逐行讀取一個大的日誌文件,讀取3行後,顯示分段錯誤。成功執行3行後出現分段錯誤

int main(int argc, char *argv[]) 
{ 
    char *line; 
    FILE *my_stream; 
    char *my_filename = "log"; 
    my_stream = fopen (my_filename, "r"); 
    while(fscanf (my_stream, "%s", &line)!= EOF) 
    { 
    printf ("==> %s\n", &line); 
    } 
    fclose (my_stream); 
    return 0; 
} 

輸出

==> 123 ==> 12345 ==> 1234568 Segmentation fault 
+1

你有試過調​​試器嗎? – 2013-04-11 19:06:11

+1

@FredrikPihl不,讓我知道,哪個使用以及如何? – Kajal 2013-04-11 19:07:00

+2

如果你在linux系統上,我推薦'gdb' – 2013-04-11 19:07:33

回答

3

您需要爲堆棧或堆中的line要麼分配空間。也不要將行的地址傳遞到fscanfprintf

int main(int argc, char *argv[]) 
{ 
    char line[256]; 
    FILE *my_stream; 
    char *my_filename = "log"; 
    my_stream = fopen (my_filename, "r"); 
    while(fscanf (my_stream, "%255s", line)!= EOF) 
    { 
     printf ("==> %s\n", line); 
    } 
    fclose (my_stream); 

    return 0; 
} 
6

你還沒有爲line分配的內存。或者聲明爲:

char line[256]; 

或者爲它做一個malloc

注意:你不需要&既不在scanf也不printf的,如果你正在處理一個字符串(%s格式)

+0

1+。另外,「行」已經是一個指針。做'&line'會得到「指向指針的指針」,它在使用的兩種情況下會出現什麼問題。 – Havenard 2013-04-11 19:09:33

+0

@KingsIndian我怎麼用char *行來做; ,沒有被數組改變 – Kajal 2013-04-11 19:10:50

+0

也不要忘記在這種情況下檢查fopen的返回值,即'my_stream'的值,以確保你可以真正讀取文件。 – Kninnug 2013-04-11 19:11:03

2

您還沒有爲該生產線分配任何空間。 fscanf因此會將您的日誌文件的行寫入內存中的某個隨機位置,並且破壞正在發生的任何事情。你有三次幸運,然後它爆炸了。

對於這項任務,你應該最好使用getline。如果你沒有,fgets會做,但你需要分配一些空間。認爲char linebuf[SOME LARGE NUMBER]

Never use *scanf.

2

char *line你一個指針爲char分配空間就行了。在您的fscanf聲明中,您將整行文本讀入該地址。您從不爲使用fscanf讀取的文本分配任何空間,因此您會覆蓋大量用於其他內容的內存。

+0

你能否詳細解釋,那我該如何解決 – Kajal 2013-04-11 19:17:00