Eccolo qua il problema:
codice:
void Alloca (mat M) {
int i;
M.m=(int**)calloc(M.r,sizeof(int*));
for (i=0;i<M.r;i++)
M.m[i]=(int*)calloc(M.c,sizeof(int));
return;
}
Stai passando per valore la matrice M.
Viene fatta una copia della struttura mat, gli viene allocata quella memoria.Ma poi siccome la procedura ritorna void, quella copia viene deallocata, i suoi campi allocati con calloc rimangono nell' heap.
Ma la tua matrice originaria, che hai passato come argomento della procedura, rimane inalterata.
Se vuoi evitare che venga fatta una copia (uguale identica, ma è un oggetto diverso !!) della matrice, l' argomento della procedura deve essere passato per indirizzo:
codice:
void Alloca (mat *M) {
int i;
(*M).m=(int**)calloc((*M).r,sizeof(int*));
for (i=0;i<(*M).r;i++)
(*M).m[i]=(int*)calloc((*M).c,sizeof(int));
return;
}
In alternativa puoi cambiarla in una funzione senza parametri di ingresso, che ritorna la matrice allocata.