Ciao, ho scritto queste righe di codice ma non fanno quello che avevo in mente.

codice:
    // FUNZIONE CANCELLA //
    int tmp_matricola;

    printf("Numero di matricola dello studente che vuoi cancellare dall'archivio: ");
    scanf("%d", &tmp_matricola);
    for(i = 0; i < MAX_STUD; i++) {
        if(ptrVettStud[i].matricola == tmp_matricola) {
            free(ptrVettStud);
            printf("Operazione avvenuta con successo!\n");
            printf("Lo studente %s %s e' stato rimosso dall'archivio.\n", ptrVettStud[i].nome, ptrVettStud[i].cognome);
        }
        else {
            printf("Il numero di matricola non e' in elenco.\n");
        }
        break;
    }    
    printf("%d\n", ptrVettStud[0].matricola);
    printf("%d\n", ptrVettStud[1].matricola);
    printf("%d\n", ptrVettStud[2].matricola);

Ci sono(almeno) due cose che non vanno: quando stampa nome e cognome dello studente cancellato il nome lo traduce in numero, sempre il solito, un 5.
Seconda cosa, non riesco a fare la FREE sulla singola cella del vettore. I tre printf finali di verifica, nel caso inserissi tre nuove matricole, continuano a stampare anche quella eventualmente cancellata.
In partenza ho scritto "free(ptrVettStud[i])" ma lo segnala come incompatibile.
Questo sotto invece è come ho creato e allocato il vettore di strutture:

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

...

for(i = 0; i < MAX_STUD; i++) {
        ptrVettStud = (STUDENTE*) malloc(sizeof(STUDENTE));
}