PDA

Visualizza la versione completa : [C] Matrici dinamiche


premoli
02-02-2011, 11:55
Ciao a tutti!!!

Stavo provando a allocare dinamicamente le matrici.
A dire il vero il programma che ho scritto funziona però vorrei conferma da qualcuno più esperto di me per vedere se salto qualcosa.
Vi ringrazio anticipatamente :D


#include <stdio.h>
#include <stdlib.h>

void allocaMat(int ***, int *, int *);
void insMat(int **, int, int);
void stampa(int **, int, int);
void liberaMat(int ***, int);

int main()
{
int **mat=NULL;
int r, c;

allocaMat(&mat, &r, &c);
insMat(mat, r, c);
stampa(mat, r, c);
liberaMat(&mat, r);

return 0;
}

void liberaMat(int ***m, int r)
{
int i;

for(i=0; i<r; i++){
free((*m)[i]);
}

free(*m);
}

void stampa(int **m, int r, int c)
{
int i, j;

printf("\n\n");

for(i=0; i<r; i++){
for(j=0; j<c; j++){
printf("%d ", m[i][j]);
}
printf("\n");
}
}

void insMat(int **m, int r, int c)
{
int i, j;

for(i=0; i<r; i++){
for(j=0; j<c; j++){
printf("\nmatrice[%d][%d] = ", i+1, j+1);
scanf("%d", &m[i][j]);
}
}
}

void allocaMat(int ***m, int *r, int *c)
{
int i;

printf("\nInserire il numero di righe: ");
scanf("%d", r);
printf("\nInserire il numero di colonne: ");
scanf("%d", c);

*m=(int **)malloc((*r)*(sizeof(int *)));

if(*m==NULL){
printf("\n\nAllocazione impossibile...");
exit(1);
}

for(i=0; i<*c; i++){
(*m)[i]=(int *)malloc((*c)*sizeof(int));
if(((*m)[i])==NULL){
printf("\n\nAllocazione impossibile...");
}
}
}

YuYevon
02-02-2011, 12:13
Corretto. Tieni presente che alla void function liberaMat() non hai bisogno di passare il puntatore per "riferimento": la free() non ne modifica il valore, si limita a deallocare l'area di memoria da esso puntata. Avrebbe senso passarlo per "riferimento" se facessi una cosa del genere:



void liberaMat(int ***m, int r)
{
int i;

for(i=0; i<r; i++){
free((*m)[i]);
(*m)[i] = NULL;
}

free(*m);

*m = NULL;
}


cioè appunto se andassi a modificare il valore del puntatore (in realtà diventa necessario solo per l'ultima istruzione, per l'altra andrebbe bene anche il passaggio per copia). Peraltro l'annullamento di un puntatore dopo la free() è operazione consigliata per evitare che eventuali altre free() accidentali sullo stesso puntatore possano causare problemi, infatti lo standard prevede che la chiamata free(NULL) non abbia effetti:



The free function causes the space pointed to by ptr to be deallocated, that is, made
available for further allocation. If ptr is a null pointer, no action occurs.

premoli
02-02-2011, 12:50
Ciao ti ringrazio veramente, allora modifico il codice in modo che il puntatore punti a NULL.
Grazie mille

Loading