Innanzitutto grazie a entrambi per le risposte.
Sto compilando il file (Main.c) come file C (impostato dalle impostazioni di Visual Studio) e ci è stato insegnato in aula che compilando in C il casting non è necessario, bensì è necessario in C++, è corretto? L'ho omesso per questo motivo, in quanto il professore non lo accetta in C puro.

Riguardo l'asterisco, ho corretto in questo modo:
codice:
void allocaClasse(int A, struct studente ***B,int C){
    int i,j;
    *B=malloc(C*sizeof(struct studente*));
    for (i=0;i<C;i++) (*B)[i]=malloc(A*sizeof(struct studente));

    for (i=0;i<C;i++) 
        for(j=0;j<A;j++){
            printf("Inserire il cognome dello studente %d: ",j+1);
            scanf("%s",&(*B)[i][j].cognome);
            printf("Inserire il nome dello studente %d: ",j+1);
            scanf("%s",&(*B)[i][j].nome);
            printf("Inserire il voto dello studente %d: ",j+1);
            scanf("%d",&(*B)[i][j].voto);

        }
}
Ma l'errore si ripresenta nello stesso punto!
Riguardo il controllo sulle malloc ti ringrazio del consiglio, metterò dei controlli. Comunque in questo caso non sta restituendo NULL in quanto la funzione stampa funziona.