[C] Problema sull'utilizzo del free() in matrice dinamica

di il
1 risposte

[C] Problema sull'utilizzo del free() in matrice dinamica

Buonasera, sto facendo un codice come esercizio che deve allocare un numero dinamico (nClassi) di classi e per ciascuna in corrispondenza un numero dinamico (nStudenti) di studenti. Ho ritenuto opportuno farlo con una matrice dinamica perchè stiamo studiando queste e volevo esercitarmici. L'obiettivo del programma è l'allocazione Run-Time da File binario qualora precedentemente creato. Questa è la prima parte, ovvero quando il file non esiste e l'utente deve inserire la prima classe. Ottengo però il seguente errore quando provo il debug (Uso Visual Studio 2010):
Windows ha generato un punto di interruzione in Gestione Classe.exe.

Ciò può essere dovuto a un danneggiamento dell'heap che indica un bug in Gestione Classe.exe o in una qualunque delle DLL che ha caricato.

È anche possibile che l'utente abbia premuto F12 mentre Gestione Classe.exe era attivo.

Controllare la finestra di output per ulteriori informazioni diagnostiche.
Il codice è il seguente, ometto le funzioni di stampa perchè il codice non funziona anche se le escludo, quindi deduco non siano il problema.
#include <stdio.h>
#include <stdlib.h>

struct studente {
    char nome[20],cognome[20];
    int voto;
};

void allocaClasse(int,struct studente ***,int);
void trasformaMaiuscola(int,struct studente***,int);
void stampaClasse(int, struct studente ***,int);

void main(){
    struct studente **classi;
    FILE *fp;
    int nClassi,nStudenti,classeAttuale,i,j;



    fp=fopen("Classi.dat","rb+");
    if(fp==NULL){
        printf("Nessuna classe trovata, si procede alla creazione di una nuova.\nQuanti studenti ne fanno parte? ");
        scanf("%d",&nStudenti);
        nClassi=1;
        classeAttuale=0;
        allocaClasse(nStudenti,&classi,nClassi);
        trasformaMaiuscola(nStudenti,&classi,nClassi);
        stampaClasse(nStudenti,&classi,classeAttuale);

        for(i=0;i<nClassi;i++) free(classi[i]);
        free(classi); 

 }
    scanf("\n");
}

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);
            scanf("%s",&(*B)[i][j].cognome);
            printf("Inserire il nome dello studente %d: ",j);
            scanf("%s",&(*B)[i][j].nome);
            printf("Inserire il voto dello studente %d: ",j);
            scanf("%d",&(*B)[i][j].voto);

        }
    }
}
Grazie per eventuali suggerimenti, cercando su Google ho notato che la memoria si libera come ho fatto io, eppure quell'errore mi fa pensare in una scorretta deallocazione, in quanto se tolgo questa parte
for(i=0;i<nClassi;i++) free(classi[i]);
free(classi); 
l'errore me lo da nel momento in cui chiudo il programma.
Devi accedere o registrarti per scrivere nel forum
1 risposte