簡體   English   中英

fgets() 導致分段錯誤

[英]fgets() causing segmentation fault

在大學里,我正在學習進程之間的通信,我有這個練習,我必須通過管道將父進程鏈接到子進程,子進程運行 cmd sort fx.txt並將輸出發送給父進程,父進程應該打印。

fx.txt的內容是

b
a

經過一番搜索,發現popen()是一個不錯的選擇,下面是我寫的一些示例代碼:

#include <stdio.h>
#include <unistd.h>

#define SIZE 255

int main() {
    FILE *file;
    char *cmd = "sort fx.txt";
    file = popen(cmd, "r");
    if (file == NULL) {
        printf("error opening pipe\n");
        return 1;
    }

    char *str;

    //print sorted lines
    while (fgets(str, SIZE, file) != NULL) {
        printf("%s", str); // \n already stored in str
    }
    pclose(file);
    return 0;
}

我在fgets()行上遇到分段錯誤。 之后,我隨機嘗試通過創建另一個指針並將fgets()的返回值分配給它來修復它。

變化如下:

    char *str;
    char *s;
    //print sorted lines
    while ((s = fgets(str, SIZE, file)) != NULL) {
        printf("%s", str); // \n already stored in str
    }

它起作用了,輸出是:

a
b

如果有人可以向我解釋這種行為,我將不勝感激。

char *str;

是一個未初始化的指針。 當你用它作為參數調用fgets時,你會導致未定義的行為。 分配一些實際空間並使用它:

char str[MAX_LINE_LENGTH];

其中MAX_LINE_LENGTH對您的程序MAX_LINE_LENGTH是合理的。

暫無
暫無

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

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