PDA

View Full Version : [C] Allocazione dinamica


Unrue
23-04-2008, 14:52
Ciao,
ho un dubbio sull'allocazione dinamica. Dunque se io alloco una matrice statica, e poi una matrice dinamica, le due matrici sono mappate in memoria esattamente allo stesso modo? O quella dinamica ha un'allocazione differente? Ve lo chiedo perché, in una chiamata MPI_Send, se scrivo:

MPI_Send(mat, 100*100, MPI_INT, 1, 0, MPI_COMM_WORLD);

con mat matrice bidimensionale allocata staticamente, funziona. Se la alloco dinamicamente invece dà Segmentation Fault. Io penso quindi che le due matrici siano allocate diversamente, e da qua nasce il problema. Infatti, il primo argomento della MPI_Send è un void*

Quindi in poche parole il mio dubbio è il seguente: se la matrice è allocata dinamicamente, le righe in memoria non sono consecutive. Ma se è allocata staticamente, lo sono?

Kerser
23-04-2008, 15:34
adesso non ricordo tanto bene visto ke è da un pò ke non programmo :D però mi sembra di ricordare ke x l'allocazione dinamica di una matrice prima di poterci andare a lavorare sopra devi allocarla tu con un tipo di variabile e la dimensione della stessa in modo ke quando vai a scriverci la matrice sia già creata in memoria...il segmentation fault è causato dal fatto ke và a a scrivere op leggere su uno spazio di memoria non dichiarato.....prova a vedere il comando malloc, realloc..

Unrue
23-04-2008, 15:54
dipende da cosa intendi per allocazione dinamica di una matrice... nessuno ti vieta di dichiarare una matrice semplicemente come un int * piuttosto che con un int **. se la dichiari semplicemente come un int *, allora le righe saranno tutte allocate consecutivamente. se invece la allochi come un int **, dipende dal contesto che non puoi prevedere a priori.:)

Intendo allocate come int**. Se definisco int*, non è una matrice, ma un vettore :)


lo stesso vale per le allocazioni statiche della memoria... dipende tutto dal contesto, molto probabilmente saranno allocate consecutivamente, ma non è detto. ;)

Non ho capito, il linguaggio C, le matrici statiche le alloca consecutivamente o no? Che intendi per "dipende dal contesto"? Cioè, se dichiaro
int matrice[100][100]
è consecutiva o no in memoria?

Unrue
23-04-2008, 15:56
adesso non ricordo tanto bene visto ke è da un pò ke non programmo :D però mi sembra di ricordare ke x l'allocazione dinamica di una matrice prima di poterci andare a lavorare sopra devi allocarla tu con un tipo di variabile e la dimensione della stessa in modo ke quando vai a scriverci la matrice sia già creata in memoria...il segmentation fault è causato dal fatto ke và a a scrivere op leggere su uno spazio di memoria non dichiarato.....prova a vedere il comando malloc, realloc..

Lo spazio di memoria è dichiarato. Il problema è dato dalla non consecutività degli elementi.

Kerser
23-04-2008, 16:17
ritornando cmq al tuo dubbio penso ke nel caso di allocazione statica la matrice non sia allocata consecutivamente in memoria mentre x la dinamica si, cmq puoi fare un pò di prove dichiarando la matrice prima in un modo e poi nell'altro e fare una lettura all'interno della matrice facendoti restituire l'indirizzo di memoria

Albi89
23-04-2008, 20:13
Indifferentemente da se dichiari "int array[10];" o "int array[10][10];" array è comunque un puntatore a intero...

Allocando staticamente sei ovviamente sicuro in entrambi i casi che tutti gli elementi della matrice/vettori sono in spazi attigui...

Allocando dinamicamente invece dipende dalla "munnezza" che hai nell'area heap... quindi non puoi dire con certezza se sarà tutto allocato in zone attigue... è facile che non sia così... in ogni caso, fai conto che anche allocando dinamicamente puoi creare una bella matrice a partire da un puntatore a intero, non c'è bisogno di scomodare puntatori a puntatori a ... :oink:

kalebbo
23-04-2008, 21:51
Ciao,
ho un dubbio sull'allocazione dinamica. Dunque se io alloco una matrice statica, e poi una matrice dinamica, le due matrici sono mappate in memoria esattamente allo stesso modo? O quella dinamica ha un'allocazione differente? Ve lo chiedo perché, in una chiamata MPI_Send, se scrivo:

MPI_Send(mat, 100*100, MPI_INT, 1, 0, MPI_COMM_WORLD);

con mat matrice bidimensionale allocata staticamente, funziona. Se la alloco dinamicamente invece dà Segmentation Fault. Io penso quindi che le due matrici siano allocate diversamente, e da qua nasce il problema. Infatti, il primo argomento della MPI_Send è un void*

Quindi in poche parole il mio dubbio è il seguente: se la matrice è allocata dinamicamente, le righe in memoria non sono consecutive. Ma se è allocata staticamente, lo sono?

Forse non ho capito bene cosa chiedi, ma se mat la allochi dinamicamente, e quindi attraverso malloc, che senso ha inviare un puntatore in remoto tramite una MPI_Send? Alla ricezione del messaggio, chi spacchetta si trova un puntatore che nel suo spazio di memoria virtuale non ha senso, e via di segfault.
Ecco perchè va inviato un blocco di memoria allocato staticamente.

Unrue
24-04-2008, 13:20
Forse non ho capito bene cosa chiedi, ma se mat la allochi dinamicamente, e quindi attraverso malloc, che senso ha inviare un puntatore in remoto tramite una MPI_Send? Alla ricezione del messaggio, chi spacchetta si trova un puntatore che nel suo spazio di memoria virtuale non ha senso, e via di segfault.
Ecco perchè va inviato un blocco di memoria allocato staticamente.

No, non invio il puntatore. L'idea era che la MPI_Send risolvesse gli indirizzi degli elementi ed inviasse quelli. Ma non è così, infatti prevede un puntatore void*, non void**. Nel secondo caso allora magari si poteva fare.

Unrue
24-04-2008, 13:22
Indifferentemente da se dichiari "int array[10];" o "int array[10][10];" array è comunque un puntatore a intero...

Allocando staticamente sei ovviamente sicuro in entrambi i casi che tutti gli elementi della matrice/vettori sono in spazi attigui...

Allocando dinamicamente invece dipende dalla "munnezza" che hai nell'area heap... quindi non puoi dire con certezza se sarà tutto allocato in zone attigue... è facile che non sia così... in ogni caso, fai conto che anche allocando dinamicamente puoi creare una bella matrice a partire da un puntatore a intero, non c'è bisogno di scomodare puntatori a puntatori a ... :oink:

Ok adesso è tutto chiaro. In pratica, linearizzando le matrici, si risolve ogni problema ed è anche più veloce :) Per caso sapete se lo stesso discorso vale anche in Fortran?