Поле name
в вашей структуре studentT
является char *
.Вы передаете этот указатель на scanf
, ничего не инициализируя.Поэтому scanf
читает неинициализированный указатель и пытается разыменовать его.Это вызывает неопределенное поведение.
Самый простой способ исправить это - изменить name
на массив, достаточно большой, чтобы вместить любую ожидаемую строку.Затем вы можете записать в массив:
typedef struct studentT {
char name[20];
int literature;
int math;
int science;
}studentT;
Альтернативно, вы можете использовать malloc
для динамического выделения пространства:
student[i].name = malloc(20);
fscanf(fp, "%19s %d %d %d", student[i].name, &student[i].literature,
&student[i].math, &student[i].science);