PDA

View Full Version : [C] Help allocazione dinamica


Cisky89
12-06-2010, 22:38
Ciao a tutti!!!
sono nuovo nel forum quindi chiedo scusa preventivamente x qualsiasi errore da me commesso :D
passo subito a porvi il mio quesito:
i due codici posti di seguito per il calcolo della diagonale di una matrice sono entrambi esatti vero??? se si, fanno entrambi le stesse identiche cose anche se in maniera differente giusto???

codice 1:
int diag(int n)
{
int mat[n][n], i, j, sum=0;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
mat[i][j]=5;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
if(i==j)
sum+=mat[i][i];
}
return sum;
}

codice 2:
int diag(int n)
{
int **mat,i,j,sum=0;
mat=(int**)malloc(n*sizeof(int*));
for(i=0;i<n;i++)
mat[i]=(int*)malloc(n*sizeof(int));
for(i=0;i<n;i++)
for(j=0;j<n;j++)
mat[i][j]=5;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
if(i==j)
sum+=mat[i][i];
}
return sum;
}

se entrambi sono corretti e fanno le stesse identiche cose, l'unica cosa che cambia è che con il secondo programma alloco dinamicamente memoria nello heap mentre col primo no...giusto???

Teo@Unix
12-06-2010, 23:01
Ciao a tutti!!!
sono nuovo nel forum quindi chiedo scusa preventivamente x qualsiasi errore da me commesso :D
Ciao, inserisci il codice tra i tag "code" e identa un minimo il codice, così è più chiaro. :)


l'unica cosa che cambia è che con il secondo programma alloco dinamicamente memoria nello heap mentre col primo no...giusto???

Esatto, alla fine ricordati di usare free().

Il secondo codice è preferibile.

Cisky89
12-06-2010, 23:23
Il secondo codice è preferibile.

Ok...grazie mille per l'aiuto!!!:D
Ma è preferibile utilizzare malloc o cmq l'allocazione dinamica solo x il fatto che se non conosco la dimensione della matrice a priori non la posso passare come parametro a una funzione, o anche per altre ragioni???

Teo@Unix
13-06-2010, 09:32
Per passarla puoi usare dei puntatori non importa sapere le dimensioni.
Invece è meglio allocare dinamicamente nell'heap piuttosto che nello stack perchè quest'ultimo ha dei limiti di dimensione massima più restrittivi dell'heap.
Basta provare ad allocare una grande matrice nello stack per avere un errore e ricevere SIGSEGV.

Cisky89
13-06-2010, 14:27
ok...XD grazie per l'aiuto!!!!:D