Проблема с односвязным списком и считыванием с файла в Си

Есть такая структура

typedef struct student {
char name[100];
int year;
float average;
struct student *next;
} STUDENT;

Которая позже используется в функции, которая по неизвестной причине не работает. По-сути там создается односвязный список, который возвращается:

STUDENT **readFromFile(char *file){
FILE *fr;
if((fr = fopen(file, "r")) == NULL) {
    return NULL;
}
int count;
fscanf(fr, "%d", &count);
STUDENT **head = NULL;
for (int i = 0; i < count; i++) {
    STUDENT *temporary = (STUDENT*)malloc(sizeof(STUDENT));
    int j=0;
    while ((temporary->name[j] = getchar()) != '\n') {
        j++;
    }
    fscanf(fr, "%d", &temporary->year);
    fscanf(fr, "%f", &temporary->average);
    temporary->next=(*head);
    (*head) = temporary;
}
fclose(fr);
return head;
}

После компиляции каждый раз неизвестные ошибки, которые я не понимаю. Помогите


Ответы (1 шт):

Автор решения: AlexGlebe

В основном ошибка использование указателя на указатель STUDENT **head = NULL;. После (*head) = temporary; произойдет запись в память по нулевому указателю и ошибка памяти. Поменяйте на обычный указатель STUDENT *head = NULL;.

Читаете буквы из консоли с помощью getchar. А надо из файла fgetc.

Потом при считывании имени забыли проставить конец строки temporary->name[j]='\00'; и проследить за переполнением из-за длинного имени.

typedef struct student {
  char name[100];
  int year;
  float average;
  struct student *next;
} STUDENT;

# include <stdio.h>
# include <stdlib.h>

STUDENT * readFromFile(char *file){
  FILE *fr;
  if((fr = fopen(file, "r")) == NULL) {
    return NULL;
  }
int count;
fscanf(fr, "%d", &count);
STUDENT * head = NULL ;
for (int i = 0; i < count; i++) {
    STUDENT *temporary = (STUDENT*)malloc(sizeof(STUDENT));
    int j=0;
    while (j < 99 && (temporary->name[j] = fgetc(fr)) != '\n') {
        j++;
    }
    temporary->name[j]='\00';
    fscanf(fr, "%d", &temporary->year);
    fscanf(fr, "%f", &temporary->average);
    temporary->next=head;
    head = temporary;
}
fclose(fr);
return head;
}
→ Ссылка