fgets()导致分段错误

时间:2020-03-15 22:01:50

标签: c linux

在大学里,我正在学习流程之间的通信,我必须进行练习,以便通过管道获得与孩子的父流程链接,孩子运行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

如果有人能向我解释这种行为,我将很感激。

1 个答案:

答案 0 :(得分:1)

char *str;

是一个未初始化的指针。当您将fgets用作参数时,会导致未定义的行为。分配一些实际空间并使用它:

char str[MAX_LINE_LENGTH];

MAX_LINE_LENGTH在您的程序中很合理。