Ci sono un po' di cose che hanno bisogno di una messa a punto.
Il tuo crash e' probabilmente questo:
Codice:
student[i].name = (char*)realloc(student[i].name , (j+1) * sizeof(char));
Vai a reallocare qualcosa che non e' stato precedentemente allocato.
Io sistemerei anche la dichiarazione di questa funzione:
Codice:
void add(STUDENT_T *student)
visto che al suo interno reallochi student, sarebbe meglio fare in modo che il nuovo indirizzo possa essere riportato al chiamante, e non perso dopo l'esecuzione della funzione