Se è possibile dovrei risolvere per domani, grazie.
Questa funzione, funziona. Fa quello che deve, posso poi continuare con tutte le altre operazioni e tutto va bene. Ma, quando chiudo il programma, sia da selezione del menu che ho creato, sia direttamente la finestra, mi va in segmentazione. SOLO se ho usato questa funzione di inserimento dati.
Se cancello lo studente inserito non da più problemi. !?
Se da questa funzione elimino le scanf alle stringhe nome e cognome... nessun problema. Davvero non capisco.

codice:
void inserisciStudente(STUDENTE* studenti) {
    int i;
    char ch;

    system("cls");
     fflush(stdin);
     printf("INSERIMENTO NUOVO STUDENTE \n\n");
     fflush(stdin);
     printf("\nNome: ");
     scanf("%49[^\n]", studenti[n_stud].nome);
     fflush(stdin);
     printf("Cognome: ");
     scanf("%49[^\n]", studenti[n_stud].cognome);
     studenti[n_stud].matricola = ++matricola;
     printf("Matricola assegnata: 00%d\n\n", matricola);
     printf("Inserire voti\n(zero per esame non sostenuto):\n\n");
     for(i = 0; i < NUM_MAT; i++) {
          printf("\t\t%s: ", materia[i].materia);
          studenti[n_stud].voto[i] = controlloValore(VOTO_MIN, VOTO_MAX);
     }
     n_stud++;
     printf("\n\n");
     system("PAUSE");
     return;
}

malloc iniziale:

codice:
studenti = (STUDENTE*)malloc(MAX_STUD * sizeof(STUDENTE));

cancella studente:

codice:
void cancellaStudente(STUDENTE* studenti) {
    int i, j, elimina;

    system("cls");
     fflush(stdin);
    printf("CANCELLAZIONE STUDENTE\n\n");
    if(n_stud == 0) {
          printf("Archivio studenti vuoto!\n\n");
    }
    else {
          printf("Numero di matricola dello studente da eliminare: ");
          elimina = controlloValore(MIN_MATRICOLA, MAX_MATRICOLA);
          for(i = 0; i < n_stud; i++) {
               if(studenti[i].matricola == elimina) {
                    printf("\n\nOperazione avvenuta con successo!\n");
                    printf("Lo studente %s %s e' stato rimosso dall'archivio.\n\n", studenti[i].nome, studenti[i].cognome);
                    for(j = i; j < n_stud; j++) {
                         studenti[j] = studenti[j + 1];
                    }
                    n_stud--;
                    system("PAUSE");
                    return;
               }
          }
          printf("\n\nIl numero di matricola inserito non e' in archivio.\n\n");
    }
     system("PAUSE");
     return;
}

strutture dati:

codice:
typedef struct STUDENTE{
    char nome[50];
    char cognome[50];
    int matricola;
    int voto[NUM_MAT];
}STUDENTE;

struct I_anno{
    char materia[50];
} materia[NUM_MAT] = {{"Programmazione"},{"Analisi"},{"Algebra e Geometria"},{"Architetture"},{"Inglese"},{"Algoritmi"};