alunos_da_turma[n_alunos - 1] = &novo_aluno;
отказано, потому что alunos_da_turma
- это dados_aluno **
, поэтому alunos_da_turma[n_alunos - 1]
- это dados_aluno *
, но novo_aluno
- это dados_aluno *
, поэтому &novo_aluno
- это dados_aluno **
Вы хотели
alunos_da_turma[n_alunos - 1] = novo_aluno;
Внимание
gets(novo_aluno->nome);
опасно (и устарело с годами), потому что если длина входной строки превышает 59 символов, которые вы выводите из поля с неожиданным поведением, выполните
fgets(novo_aluno->nome, sizeof(novo_aluno->nome), stdin);
Однако, кроме того, что если вы введете имя в той же строке, в которую введете матрикулу, вы получите пустую строку, потому что остальная часть строки / новой строки не сброшена на fflush(stdin);
, fflush не работает вне файла
Если имя не может содержать разделитель, используйте scanf("%59s", novo_aluno->nome);
вместо fgets , иначе символы обхода до новой строки явно
Примечание также в
alunos_da_turma = realloc(alunos_da_turma, (sizeof(dados_aluno *) * (n_alunos + 1)));
вы перераспределяете с одним дополнительным элементом, вы уже увеличились n_alunos
Ведение
int done = 0;
...
while (done == 0){
...
if (matricula_atual == -1){
done = 1;
continue;
}
...
}
довольно сложно, и его можно заменить на
for (;;) {
...
if (matricula_atual == -1)
break;
...
}