![](/img/trans.png)
[英]segmentation fault in fgets, trying to run shell command in c program
[英]Getting fgets warning when trying to run optimized c file
這是一個更大文件的一部分,但這是唯一有問題的 function。 這就是問題所在,如果我在未優化的 gcc 中編譯它,我將毫無問題地得到我想要的一切。 但是,如果我嘗試將其編譯為 gcc -c -pg -02 main.c,我會收到以下錯誤消息
與其他任何輸入的 function 一樣, fgets
可能由於各種原因而失敗。 從其文檔中可以找到,如果發生這種情況,它將返回NULL
。 但是,由於您不查看它的返回值,因此您永遠不會知道。 這就是編譯器試圖警告您的內容。 如果失敗,數組line
不包含有效輸入,並且可能包含垃圾,如果您嘗試處理它會導致您的程序行為不端。
(在很多情況下,只有在優化時才會出現一些警告;這是因為編譯器會在優化過程中對代碼進行更詳細的分析,這使得它更有可能檢測到此類問題。但這很好事情;這不是優化的問題,也不是不使用它的理由。)
如果fgets
失敗,您的程序沒有明顯的恢復方法,因此最簡單的方法是讓它退出並顯示錯誤消息。 perror
function 是一種方便的方法; 它打印一條人類可讀的消息,對應於fgets
應該設置的errno
變量中的錯誤代碼。
因此,這里的錯誤檢查的基本形式是將您的fgets
行替換為:
if (fgets(line,MAX_LINE ,stdin) == NULL) {
perror("Failed to read input");
exit(1);
}
您以后可以改進的一些事情:
fgets
返回 NULL 的一個可能原因是文件結束:如果根本沒有輸入:用戶在他們的終端上點擊文件結束鍵(通常是 Unix 上的 Ctrl-D,Windows 上的 Ctrl-Z)或從空文件重定向輸入。 這並不完全是一個錯誤,它不會導致errno
中的錯誤代碼,因此在這種情況下perror
可能會打印出誤導性消息。 嘗試並修復此錯誤。 您可以使用ferror
function 區分這兩種情況。
如果一行被成功讀取但無法解析為數字, strtol
將失敗。 您目前也不檢查。 查看它如何指示此故障並相應地處理它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.