Pagina 1 di 2

[c] puntatori a void [RISOLTO]

Inviato: mer 6 gen 2010, 19:11
da Blallo
sto ripassando un po' i puntatori e mi servirebbe una delucidazione
dato questo

Codice: Seleziona tutto

    pTR=el;
    free_all(pTR, n_city);
    pTR=matr;
    free_all(pTR, n_city);
che come avrete forse già capito el e matr sono 2 puntatori (precisamente puntatori a puntatori) che essendo di tipo diverso ma di stessa "categoria", vorrei liberare con la free_all senza doverla scrivere 2 volte (perchè mi scoccia :p )
pTR è un **void
ora volendo potrei pure modificare leggermente la free_all in modo da fare free di entrambe le memorie dei puntatori matr e el, ma dato che volevo capire meglio il funzionamento dei puntatori a void, mi chiedevo se quello fatto li fosse in qualche modo corretto, perchè mi dà dei warning

Re: [c] puntatori a void

Inviato: mer 6 gen 2010, 20:27
da ulisse89
Cosa vuol dire che pTR è un **void? Void non si usa per indicare funzioni che non hanno valore di ritorno?

Re: [c] puntatori a void

Inviato: mer 6 gen 2010, 20:32
da Blallo
si scusa, volevo dire che è un puntatore a void
ma da quello che ho letto, un puntatore a void si può assegnare ad un puntatore di qualunque altro tipo
ciò nonostante mi da warning
non che sia un problema, ma vorrei solo capirne il funzionamento

Re: [c] puntatori a void

Inviato: mer 6 gen 2010, 20:43
da ulisse89
jimmy_page_89 ha scritto:si scusa, volevo dire che è un puntatore a void
ma da quello che ho letto, un puntatore a void si può assegnare ad un puntatore di qualunque altro tipo
ciò nonostante mi da warning
non che sia un problema, ma vorrei solo capirne il funzionamento
Ti da il warning per l'assegnamento che fai? (pTR=el e pTR=matr).

Re: [c] puntatori a void

Inviato: mer 6 gen 2010, 20:52
da Blallo
si

Re: [c] puntatori a void

Inviato: mer 6 gen 2010, 21:59
da Vito
Che tipo di warning ti restituisce?

Re: [c] puntatori a void

Inviato: mer 6 gen 2010, 22:06
da shark1500
Scusa, ma non devi fare un cast a void prima?

Prova a fare un programmino piu` semplice che riproduca lo stesso errore e copialo qua per intero, cosi` e` difficile da capire il problema

Re: [c] puntatori a void

Inviato: mer 6 gen 2010, 22:49
da Vito
C'è bisogno del casting a void,ho fatto delle semplici prove.
Il compilatore dealloca l'area di memoria,ma si dovrebbe creare un memory leak dovuto al fatto che non sa quanta memoria deallocare (poichè non fai il casting al tipo dei due puntatori.).

in codice(non ricordo la sintassi del C,quindi scrivo in C++):

Codice: Seleziona tutto

	int* a=new int;
	*a=2;
	void* b=a;
	a=0;
	delete  (int*)b;
la delete (analoga di free) sa quanta memoria deve deallocare grazie al casting (*int) che converte il puntatore a void a puntatore ad intero.
P.S (new è equivalente a malloc)

Re: [c] puntatori a void

Inviato: mer 6 gen 2010, 22:51
da phobos3576
shark1500 ha scritto:Scusa, ma non devi fare un cast a void prima?
Infatti, la sintassi corretta per la chiamata di free_all dovrebbe essere

Codice: Seleziona tutto

free_all((void **)pTR, n_city);

Re: [c] puntatori a void

Inviato: mer 6 gen 2010, 22:54
da Vito
phobos3576 ha scritto:
Infatti, la sintassi corretta per la chiamata di free_all dovrebbe essere

Codice: Seleziona tutto

free_all((void **)pTR, n_city);

Il casting non dovrebbe essere riferito al tipo di el e matr?

Re: [c] puntatori a void

Inviato: mer 6 gen 2010, 22:57
da phobos3576
Vito ha scritto:
phobos3576 ha scritto:
Infatti, la sintassi corretta per la chiamata di free_all dovrebbe essere

Codice: Seleziona tutto

free_all((void **)pTR, n_city);

Il casting non dovrebbe essere riferito al tipo di el e matr?
Si, Infatti, jimmy_page_89 dice che el e matr sono entrambi puntatori a puntatori.

Re: [c] puntatori a void

Inviato: mer 6 gen 2010, 23:18
da Vito
Comunque concordo sul fatto che magari qualche riga di codice in più renderebbe più chiara la risoluzione del warning...

Io ho trovato qualcosa qui: http://it.wikipedia.org/wiki/Malloc (siccome programmo in C++ ed in C ho usato pochissimo l'allocazione dimanica della memoria).

Re: [c] puntatori a void

Inviato: gio 7 gen 2010, 8:16
da kreen
Vito ha scritto: la delete (analoga di free) sa quanta memoria deve deallocare grazie al casting (*int) che converte il puntatore a void a puntatore ad intero.
P.S (new è equivalente a malloc)
Ciao Vito,
non è così.
La delete conosce la memoria da liberare perché l'hai allocata con una malloc o simile, producendo una system call al sistema operativo che memorizza in una tabella inizio e dimensione della memoria che ti riserva. Quando allochi memoria dinamica richiedi un certo tot di byte. Al limite se vuoi una soluzione portabile che allochi 5 oggetti di un certo tipo usi sizeof.

Il casting non c'entra assolutamente nulla.

Re: [c] puntatori a void

Inviato: gio 7 gen 2010, 10:58
da Vito
kreen ha scritto:
Vito ha scritto: la delete (analoga di free) sa quanta memoria deve deallocare grazie al casting (*int) che converte il puntatore a void a puntatore ad intero.
P.S (new è equivalente a malloc)
Ciao Vito,
non è così.
La delete conosce la memoria da liberare perché l'hai allocata con una malloc o simile, producendo una system call al sistema operativo che memorizza in una tabella inizio e dimensione della memoria che ti riserva. Quando allochi memoria dinamica richiedi un certo tot di byte. Al limite se vuoi una soluzione portabile che allochi 5 oggetti di un certo tipo usi sizeof.

Il casting non c'entra assolutamente nulla.
Sisi,rileggendo un po' di cose su malloc e free mi sono reso conto di aver detto una cosa non giusta,grazie per la dritta. :thumbright:

P.S. Ma ti riferivi alla free?
Perchè con la delete ho bisogno di fare il casting..(ho puntatore a void con il quale alloco un vettore di interi,quando voglio liberare la memoria se non faccio il casting mi restituisce un warning).

Re: [c] puntatori a void

Inviato: gio 7 gen 2010, 11:14
da kreen
Sì Vito,
mi riferivo alla free.
La free è legata a malloc, dove dichiari il numero di byte che ti servono e ti restituisce un puntatore void verso la memoria allocata (perciò per usarlo devi fare un cast).

La new del C++ funziona in maniera diversa, come tu sai. Ad esempio

Codice: Seleziona tutto

int *c = new int;
perciò non c'e' bisogno di usare cast.