2013-04-09 62 views
0

我想計算一個文件中每個單詞的數量。該文件可以是stdin或命令行中提供的文件名(./ count -f filename)。到目前爲止,程序在從命令行讀取文件時會提供正確的輸出。但是當我試圖從標準輸入讀取時發生錯誤。該程序首先輸出正確的結果,然後給出分段錯誤(核心轉儲)。一個有趣的事情是該程序在我的Mac上運行,但它在Linux上不起作用。從標準輸入分段錯誤(核心轉儲)

+1

代碼會幫助很多。只是說' – 2013-04-09 19:58:02

+1

你能縮小一點代碼嗎? – 2013-04-09 19:58:03

+0

不需要兩個代碼路徑。只要做一些像'FILE * fp = argc> 2? fopen(argv [2]):stdin;'(請務必檢查錯誤) – 2013-04-09 19:58:24

回答

0

OK,而不是給你一條魚,我會教你如何釣魚...

當你segmentation fault這意味着該操作系統已檢測到一個內存訪問錯誤。 當你玩指針時,這通常發生在C/C++中。指針非常危險,必須小心處理。

如何檢測出現問題的位置? 那麼,當您的程序收到SEGFAULT時,Linux並不是非常豐富,但是它提供了大量信息。你只需要知道如何「閱讀」它。

coredump,是在出現分段錯誤時的內存,堆棧和變量的圖片。運行它

gdb myapp core 

其中myapp是您的應用程序可執行文件,而core是coredump。 現在你會看到類似這樣的:

GNU gdb 19991004 

Copyright 1998 Free Software ���.� 

Core was generated by `testit'. 

Program terminated with signal 11, Segmentation fault. 

Reading symbols from /usr/lib/libstdc++-libc6.1-1.so.2...done. 

Reading symbols from /lib/libm.so.6...done. 

Reading symbols from /lib/libc.so.6...done. 

Reading symbols from /lib/ld-linux.so.2...done. 

#0 0x823221a in main() at blabla.c:3 

10    *i++;  

它會準確地告訴你哪一行引起的故障。 如果您想確切知道如何到達該行,請鍵入bt 這將向您顯示從應用程序main()直到實際故障(包括傳遞給函數的參數)的回溯。

我認爲,一旦你確切地知道分段錯誤發生的位置,你將更容易解決它。

幾點注意事項:

  1. 如果不創建轉儲。在控制檯 類型的:

    ulimit -c unlimited 
    
  2. 你需要使用-g編譯程序,以使在gdb的符號有意義的名稱。