View Full Version : [C] Allocazione dinamica
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?
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..
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?
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.
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
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:
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.
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.
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?
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.