|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Sep 2005
Messaggi: 1400
|
[C] Problema: allocazione dinamica array di struct tramite funzione
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 Codice:
typedef struct{
....
} tData;
void crea(tData *p){
p = (tData *)malloc(sizeof(tData));
}
Ultima modifica di SerMagnus : 23-09-2011 alle 15:29. |
|
|
|
|
|
#2 | |
|
Senior Member
Iscritto dal: Dec 2006
Messaggi: 3808
|
Quote:
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. |
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Sep 2005
Messaggi: 1400
|
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 |
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Jan 2007
Messaggi: 2267
|
Freaxxx ha ragione. Dovresti porre tData *(&p) come argomento formale della funzione.
Quote:
Quando chiami crea(p), l'argomento formale della funzione viene inizializzato con una copia del puntatore che viene deallocata all'uscita della funzione.
__________________
Concluso con:... |
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Sep 2005
Messaggi: 1400
|
ah cavolo, dovevo usare un puntatore a puntatore, ecco perhcè non mi trovavo... effettivamente era facile, come perdersi in un bicchier d'acqua
posto il codice corretto per per altri noob come me: Codice:
typedef struct{
....
} tData;
int main(){
...
tData *ptr;
crea(&ptr);
...
}
void crea(tData **p){
*p = (tData *)malloc(sizeof(tData));
(*p)->campo=123;
}
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 00:16.



















