Ciao a tutti,
sono arrivato alla MALLOC! e tra gli esercizi mi viene chiesto di allocare la memoria per una matrice.
ci sono riuscito creando una matrice, o meglio un puntatore a puntatori **matrice
nella fase di allocazione però ho avuto difficoltà e ho trovato delle spiegazioni sul web che mi hanno permesso di concludere l'esercizio ma non mi spiegavano esaustivamente il funzionamento.
int main (void)
{
int **matrice;
int x,y;
int i,j;
printf("quante righe? ");
scanf("%d",&x);
printf("quante colonne? ");
scanf("%d",&y);
matrice=malloc(x*sizeof *matrice); <<<<<<<<<< quesito 1
for (i=0;i<y;i++){
matrice[i]=malloc(x*sizeof **matrice); <<<<<<<<<<<<<quesito 2
if (matrice[i]==NULL){
return -1;
}
}
for (i=0;i<x;i++){
for (j=0;j<y;j++){
matrice[i][j]=rand()%999;
printf("[%d][%d]%3d ",i,j,matrice[i][j]);
}
printf("\n");
}
for (i=0;i<x;i++){
free(matrice[i]); <<<<<<<<<<<< quesito 3
}
free(matrice);
}
vquesito 1: normalmente alloco una dimensione pari a (x * sizeof(int)) mentre qui ho allocato (x*sizeof *matrice). leggendolo potrei pensare che lo spazio da allocare è pari al valore che ho chiesto da tastiera, identificabile come il numero di celle del primo array, la "riga", moltiplicato per la la dimensione dell'array.
A questo punto è allocata la memoria di tutta la matrice???
quesito 2: qui mi sembra di allocare la memoria di tutti gli array, tutte le righe, della matrice.
ecco, ma se ho già allocato tutta la matrice nel punto prima? al quesito 1....
non capisco, mi sembrano 2 cose "uguali", o meglio, mi sembra più completa la seconda, quella del quesito 2...
quesito 3: perché la free deve avvenire simmetricamente? forse con la spiegazione dei primi 2 quesiti qui ci arriverei anche solo...
grazie a tutti, qui trovo sempre tante persone competenti che mi danno sempre un ottimo aiuto!!