Похоже, что при использовании указателя students
у вас есть дополнительный уровень указателей, который вам не нужен, чтобы вызывать некоторую путаницу. Вы также получаете доступ за концом выделенного массива.
Так что вместо
StudentType *students[30];
Что дает вам массив из 30 указателей на StudentType. Я думаю, вы, вероятно, просто хотели:
StudentType *students;
Это простой указатель на StudentType, который можно использовать как основу для динамически размещаемого массива. Затем, когда вы делаете распределение, вы делаете это:
students = malloc(sizeof(*students) * NumOfStudents);
И вам придется инициализировать каждый из этих StudentTypes, прежде чем использовать их.
for(i=0;i<NumOfStudents;i++)
{
students[i].firstname = malloc(30);
students[i].lastname = malloc(30);
}
Обратите внимание, что каждый StudentType теперь доступен напрямую как элемент из массива студентов как student[i]
, а не как *students[i]
, который у вас был неправильный. Вы можете расширить это до остальной части вашего кода. Помните, что вы можете получить доступ только из индекса 0 к NumOfStudents-1, поэтому не используйте студентов [NumOfStudents].
Другая проблема, с которой вы столкнетесь, заключается в том, что когда вы используете fscanf (), вам нужно передать адрес переменной, чтобы сохранить результат при использовании оператора амперсанда. В настоящее время вы только передаете значение, например, вы должны использовать &students[i].marks.firstAssignment
вместо (*students[i]).marks.firstAssignment
, при условии, что вы также исправите ошибки указателя.