fgets () вызывает ошибку сегментации - PullRequest
1 голос
/ 16 марта 2020

В колледже я изучаю связь между процессами, и у меня есть это упражнение, где я должен получить ссылку родительского процесса на ребенка через канал, ребенок запускает команду 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 Ответ

1 голос
/ 16 марта 2020
char *str;

Неинициализированный указатель. Когда вы вызываете fgets с аргументом, вы вызываете неопределенное поведение. Выделите некоторое пространство и используйте его:

char str[MAX_LINE_LENGTH];

Где MAX_LINE_LENGTH - это что-то разумное для вашей программы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...