malloc
возвращает блок неинициализированной памяти.Итак, students[i].firstName
- это неинициализированный указатель, который вы пытаетесь разыменовать.Чтение и разыменование неинициализированного указателя вызывает неопределенное поведение, которое в этом случае проявляется как сбой.
Когда вы делаете выделяете место для элемента firstName
, вы выделяете только sizeof(char*)
байтдля него размер указателя, а не длина строки, которую вы хотите прочитать.
Создайте буфер для чтения строк, достаточно большой для того, что вам может понадобиться, затем используйте strdup
создать копию для присвоения соответствующему указателю.
student *students = NULL;
int i = 0;
char str[100];
scanf("%99s", str);
while (str[0] != '.'){
students = realloc(students, sizeof(*students) * (i+1));
students[i].firstName = strdup(str);
i++;
scanf("%99s", str);
}