Con quel codice leggi un solo carattere (o meglio, puoi leggere solo un carattere).
Devi allocare un'array piu' grande (che deve comprendere il carattere terminatore), e devi allocarlo dinamicamente (con malloc e free) perchè altrimenti al ritorno da quella funzione l'array viene deallocato.
Sopra il main ho fatto una cosa del tipo
codice:
struct studente *ptr;
ptr = malloc(sizeof(struct studente));
che non penso sia molto pulito... Come posso risolvere e parlare con questo array di strutture nei metodi?

E poi comunque attento perchè scanf considera come carattere di fine inserimento anche lo spazio, quindi dovresti fare una chiamata per inserire il nome ed una per il cognome.
Non ho ben capito la seconda parte.