PDA

Visualizza la versione completa : dubbio su puntatore void* [c++]


Metflar
27-04-2008, 10:37
allora nella mia applicazione uso questo void* faccio l'allocazione(sennò mi da segmentation fault) ma poi deve essere continuamente cambiato il valore...cm posso fare?

andbin
27-04-2008, 11:08
Originariamente inviato da Metflar
allora nella mia applicazione uso questo void* faccio l'allocazione(sennò mi da segmentation fault) ma poi deve essere continuamente cambiato il valore...cm posso fare? Non so cosa hai fatto ma se hai usato funzioni di allocazione della memoria tipo malloc/calloc loro ti forniscono un void* perché ovviamente non "sanno" nulla di come dovrai trattare quell'area di memoria e che cosa dovrà contenere. Spetta a te fare un "cast" di quel puntatore ad un puntatore di un tipo più specifico che ti consentirà di operare sull'area in base a cosa dovrà contenere.

Metflar
27-04-2008, 11:13
Originariamente inviato da andbin
Non so cosa hai fatto ma se hai usato funzioni di allocazione della memoria tipo malloc/calloc loro ti forniscono un void* perché ovviamente non "sanno" nulla di come dovrai trattare quell'area di memoria e che cosa dovrà contenere. Spetta a te fare un "cast" di quel puntatore ad un puntatore di un tipo più specifico che ti consentirà di operare sull'area in base a cosa dovrà contenere.
ho fatto


void* miopuntatore;
miopuntatore=(char*)malloc(sizeof(char)*256);
...
read(0,miopuntatore,256);
...

funziona tutto ma se una stringa nn è lunga 256 caratteri è un problema asd!

andbin
27-04-2008, 11:41
Originariamente inviato da Metflar
ho fatto


void* miopuntatore;
miopuntatore=(char*)malloc(sizeof(char)*256);
...
read(0,miopuntatore,256);
...

funziona tutto ma se una stringa nn è lunga 256 caratteri è un problema asd! A parte il fatto che non è il modo più comodo per leggere righe in input .... comunque quale è il problema esatto??

Se ad esempio digiti "ciao" seguito da INVIO, la read() ritornerà restituendo il valore 5 e il buffer sarà riempito con i caratteri 'c' 'i' 'a' 'o' '\n'
A quel punto se vuoi ottenere una stringa gestibile in C/C++ devi semplicemente togliere quel \n e metterci \0.

Metflar
27-04-2008, 13:15
Originariamente inviato da andbin
A parte il fatto che non è il modo più comodo per leggere righe in input .... comunque quale è il problema esatto??

Se ad esempio digiti "ciao" seguito da INVIO, la read() ritornerà restituendo il valore 5 e il buffer sarà riempito con i caratteri 'c' 'i' 'a' 'o' '\n'
A quel punto se vuoi ottenere una stringa gestibile in C/C++ devi semplicemente togliere quel \n e metterci \0.
cm lo aggiungo lo '\0' al puntatore?

daniele_dll
27-04-2008, 13:26
invece di fare questo potrebbe resettare prima l'area di memoria con, ad esempio, memset o simili su zero

Metflar
27-04-2008, 13:34
Originariamente inviato da daniele_dll
invece di fare questo potrebbe resettare prima l'area di memoria con, ad esempio, memset o simili su zero
ok cn memset funziona grazie! :ciauz:

oregon
27-04-2008, 13:40
Originariamente inviato da Metflar
ho fatto


void* miopuntatore;
miopuntatore=(char*)malloc(sizeof(char)*256);




Non capisco perche' non scrivi



char* miopuntatore;
miopuntatore=(char*)malloc(sizeof(char)*256);

Metflar
27-04-2008, 13:52
Originariamente inviato da oregon
Non capisco perche' non scrivi



char* miopuntatore;
miopuntatore=(char*)malloc(sizeof(char)*256);

pensavo che nn mi avrebbe fatto fare il casting da char* a void* invece ora noto che lo fa :D

oregon
27-04-2008, 14:38
Originariamente inviato da Metflar
... da char* a void* ...

Veramente e' da void * a char * .... comunque ...

Loading