Ошибка сегментации в fgets() - язык C

Я получаю ошибку сегментации именно в этой строке:

while (fgets(line, MAX_LEN + 1, stream) != NULL) {

....

}

где MAX_LEN - 500, строка читает текущую строку, и поток открывается через fopen(filename, "r");

Я читаю строки из файла с определенным форматом, и я получаю ошибку сегментации (дампы ядра) именно в этой строке в соответствии с отладчиком.

Я сделал свой код так, чтобы он игнорировал строки, которые не соответствуют формату scanf.

Вот что я реализую. Что-то близкое к этому хотя бы

int main(int argc, int **argv) {
....
....
if (argc == 1) {
printf("enter file name: ");
scanf("%s", filename);
if (!(stream = fopen(filename, "r"))) {
    perror("Error message goes here.");
    exit(EXIT_FAILURE);
}


} else if (argc == 2) {
stream = fopen(argv[1], "r");
 if (sream == NULL) {
   fprintf(stderr, "error message", argv[1], errno));
   return EX_OSERR;
 }
}

while (fgets(line, MAX_LEN + 1, stream) != NULL) {
 if (sscanf(line, "%49[^@ ]@%49s -> %49[^@ ]@%49s", sender_username, sender_hostname,  receiver_username, receiver_hostname) != 4) {
  continue;
} else {

do work;

}

0 ответов

Segfault, скорее всего, относится к переменной "line", как объявлена ​​строка?

символьная линия [MAX_LEN+1];

или же

char * line = malloc(MAX_LEN+1);

Вы вряд ли получите ошибку сегментации, переполнив буфер всего на один байт (хотя это все равно будет плохо). Строка переменной, вероятно, указывает на недопустимую память.

Из других комментариев мое лучшее предположение состоит в том, что что-то в стеке было переполнено, и fgets вызывает ошибку сегментации. Это может быть вызвано указателем файла, поврежденным указателем char * или какой-либо другой проблемой.

Недостаточно предоставленного кода, чтобы дать лучший ответ.

Другие вопросы по тегам