PDA

View Full Version : [C] Problema: allocazione dinamica array di struct tramite funzione


SerMagnus
23-09-2011, 14:27
Ciao raga,
c'è qualcosa che non mi torna, sto provato ad allocare dinamicamente una struct (con malloc) tramite una funzione, però ho un problema:

Se alloco tramite malloc la struct e ritorno il puntatore all'area allocata tutto ok

Però invece se passo il puntatore che dovrà puntare all'area di memoria, come argomento della funzione nascono i problem: l'area puntata risulta visibile solo nella funzione e non al di fuori e il programma crasha

ecco il codice che da errore


typedef struct{
....
} tData;

void crea(tData *p){
p = (tData *)malloc(sizeof(tData));
}


dove sbaglio?

Freaxxx
23-09-2011, 15:03
Ciao raga,
c'è qualcosa che non mi torna, sto provato ad allocare dinamicamente una struct (con malloc) tramite una funzione, però ho un problema:

Se alloco tramite malloc la struct e ritorno il puntatore all'area allocata tutto ok

Però invece se passo il puntatore che dovrà puntare all'area di memoria, come argomento della funzione nascono i problem: l'area puntata risulta visibile solo nella funzione e non al di fuori e il programma crasha

ecco il codice che da errore


typedef struct{
....
} tData;

void crea(tData *p){
p = (tData *)malloc(sizeof(tData));
}


dove sbaglio?

hai presente come funziona lo stack?

tu con quella scrittura tra parentesi tonde stai dicendo alla funzione "ti passo un puntatore di tipo tData, ovvero che punta ad un oggetto di tipo tData, chiamalo p", ok?

il puntatore non è altro che una variabile come le altre, quando la funzione esaurisce il suo compito la porzione di stack relativa ad essa viene liberata e con essa anche il tuo puntatore, se vuoi far filtrare il valore del tuo puntatore al di fuori lo devi passare per riferimento.

SerMagnus
23-09-2011, 15:15
sisi ho presente, infatti immaginavo fosse quello il problema.
sarà che mi impapocchio con il c++

ma scusa, in c il passaggio per riferimento si effettuasse proprio con i puntatori ò_O

Floris
23-09-2011, 15:32
Freaxxx ha ragione. Dovresti porre tData *(&p) come argomento formale della funzione.
ma scusa, in c il passaggio per riferimento si effettuasse proprio con i puntatori ò_O
Si. Ma tu vuoi modificare il valore del puntatore, cioè l'indirizzo di memoria a cui punta (creandola dinamicamente) e non l'area di memoria a cui questo punta. Volendo modificare il valore del puntatore (l'indirizzo di memoria che contiene) devi passare il puntatore al puntatore oppure il riferimento al puntatore.

Quando chiami crea(p), l'argomento formale della funzione viene inizializzato con una copia del puntatore che viene deallocata all'uscita della funzione.

SerMagnus
23-09-2011, 17:18
ah cavolo, dovevo usare un puntatore a puntatore, ecco perhcè non mi trovavo... effettivamente era facile, come perdersi in un bicchier d'acqua :D

posto il codice corretto per per altri noob come me:



typedef struct{
....
} tData;


int main(){
...
tData *ptr;
crea(&ptr);
...
}

void crea(tData **p){
*p = (tData *)malloc(sizeof(tData));
(*p)->campo=123;
}