簡體   English   中英

C,Ubuntu 22.04 上的分段錯誤(核心已轉儲)

[英]C, Segmentation fault (core dumped) on Ubuntu 22.04

我正在學習 C,最近我從 Windows 搬到了 Linux。我正在編寫一個簡單的程序,經常出現錯誤: Segmentation fault (core dumped) 我分析了所有代碼並意識到錯誤是由從文件中讀取數據的 function 引起的:

FILE *f_out = fopen("sysdata.txt","r+");
char line[30];
while (fgets(line, sizeof(line), f_out) != NULL)
{
    count++;
    if (count == 0)
    {
        if (line != "1") {first_project = true;}
        else {first_project = false;}
    }
}

我在網上搜索了一下:我不是很了解這個錯誤(我是c學習的基礎)但是我發現了這個 這是唯一可以幫助我的教程,但我在最后一個命令中遇到錯誤:運行sudo dpkg -l | grep ^..r | 易於清除 錯誤就在這里

我在網上搜索但沒有。 任何人都知道如何解決這個問題或如何在沒有分段錯誤的情況下使我的應用程序工作?

所提供的代碼存在幾個問題,但如果您的段錯誤出現在那里,那么唯一合理的解釋是fopen()失敗,可能是因為程序的工作目錄中沒有具有指定名稱的文件。 fopen()在失敗時返回一個 null 指針,程序有責任在嘗試將結果用於 I/O 函數之前檢查它。 如果您確實嘗試將 null 指針與fgets()一起使用,則可能會出現段錯誤。

Windows 和 Linux 的情況大致相同,但我相信 Windows 的術語略有不同。 但是,您對 Linux 的不熟悉可能會導致您誤解該程序的工作目錄用於您的測試運行。

當您的程序想要訪問程序分配的 memory 區域之外的 memory 地址時,就會發生分段錯誤,通常稱為段錯誤。 這意味着您可以通過例如讀取數組邊界之外的內容來獲得段錯誤。

但是這里的段錯誤不是問題的直接原因。 段錯誤發生在fgets function 內部。這是因為文件處理程序可能是 NULL,這意味着它沒有成功打開。 您的代碼需要的是一個小檢查以確保f_out不是 NULL。

if (f_out == NULL)
{
   puts("file could not be opened");
   return 1;
}

在打開文件后添加它,你應該沒問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM