PDA

Visualizza la versione completa : [c] allocazione di una stringa dinamica


xnavigator
07-06-2009, 13:14
ragazzi per allocare una stringa dinamica (cioè che poi potrò fare una realloc durante l'esecuzione se mi serve più spazio) come la devo dichiarare?

char **myStr;

2 deferenziazioni?


per quanto riguarda la dichirazione poi dovrebbe essere:


myStr = (char **)calloc(1,sizeof(char));

// altro codice

myStr = (char**)realloc(myStr, 2 * (sizeof(char));




hm riguardando non penso proprio sia corretto...

YuYevon
07-06-2009, 13:40
No, perché mai dovresti dichiararla come puntatore a puntatore? Devi dichiarare un puntatore singolo, non capisco quale sia il problema...

oregon
07-06-2009, 14:53
Originariamente inviato da xnavigator
ragazzi per allocare una stringa dinamica (cioè che poi potrò fare una realloc durante l'esecuzione se mi serve più spazio) come la devo dichiarare?


Non hai ancora assimilato il concetto di semplice puntatore ... ti consiglio di fermarti ancora un po' a studiarlo ...

xnavigator
07-06-2009, 16:04
Originariamente inviato da YuYevon
No, perché mai dovresti dichiararla come puntatore a puntatore? Devi dichiarare un puntatore singolo, non capisco quale sia il problema...

perchè una stringa sarebbe un array e quindi un puntatore, e dovendolo fare dinamico mi serve un puntatore a quest'array di char no ?

grazie per le spiegazioni ( anche se vedo che arrivano con il contagoccie )

oregon
07-06-2009, 16:08
Originariamente inviato da xnavigator
perchè una stringa sarebbe un array e quindi un puntatore, e dovendolo fare dinamico mi serve un puntatore a quest'array di char no ?

No.

Se e' gia' un puntatore, non ha senso farlo doppio.


( anche se vedo che arrivano con il contagoccie )

Probabilmente perche' sarai in ritardo con il pagamento del servizio .... :)

xnavigator
07-06-2009, 16:17
Originariamente inviato da oregon
No.

Se e' gia' un puntatore, non ha senso farlo doppio.


bhè allora forse mi sfugge qualcosa:

io creo la variabile char *myVar;

viene allocata in una parte della memoria 4byte per il puntatore ad un char.
per allocare il primo char faccio:

myVar = (char *) malloc(sizeof(char));
a questo punto posso settare il mio primo carattere facendo:

myVar[0] = 'a';

ora mettiamo che nell'esecuzione del codice setto altre variabili dinamiche, queste variabili dinamiche verranno allocate proprio dopo l'indirizzo di memoria del primo elemento myVar[0]

e quindi se vorrò reallocare myVar per permettermi di salvare un nuovo carattere myVar[1]='b';

non potrò farlo perchè quell'indirizzo di memoria dopo myVar[0] sarà stato allocato per quelle altre variabili dinamiche...

giusto?

forse la risposta sta nel fatto che le diverse variabili dinamiche non sono allocate tutte consecutivamente ma in diversi spazi di memoria preservando l'eventuale aritmetica dei puntatori...

oregon
07-06-2009, 16:25
Originariamente inviato da xnavigator
bhè allora forse mi sfugge qualcosa:
...
non potrò farlo perchè ...
giusto?



Sbagliato ...

La malloc provvede ad allocare lo spazio iniziale necessario.

Se chiami la realloc, questa provvede ad allocare lo spazio richiesto. Se non puo' farlo dopo lo spazio gia' allocato, riserva un altro opportuno blocco muovendo i dati dal precedente.

In pratica, non ti devi curare di questo aspetto perche' ci pensa la realloc.

Ma cosa c'entra tutto cio' con i doppi puntatori? :confused:

xnavigator
07-06-2009, 16:31
Originariamente inviato da oregon


Se chiami la realloc, questa provvede ad allocare lo spazio richiesto. Se non puo' farlo dopo lo spazio gia' allocato, riserva un altro opportuno blocco muovendo i dati dal precedente.


dannazione... questo piccolo particolare mi era sfuggito :sbav:



Ma cosa c'entra tutto cio' con i doppi puntatori? :confused:

il doppio puntatore avevo pensato di farlo cosi per avere un array di puntatori a char, cosi
da avere i char veri e propri spari per la memoria (per non incorrere in quel problema che avevo detto prima) e l'array di puntatori che puntava ai vari char sparsi in mem :zizi:

non c'è ne bisogno ci pensa la realloc :zizi:

oregon
07-06-2009, 16:41
Originariamente inviato da xnavigator
dannazione... questo piccolo particolare mi era sfuggito :sbav:
...
non c'è ne bisogno ci pensa la realloc :zizi:

Forse questo succede perche' non studi la documentazione ...

http://www.cplusplus.com/reference/clibrary/cstdlib/realloc/

xnavigator
07-06-2009, 17:13
:madai!?:

Loading