View Single Post
Old 22-04-2005, 13:20   #1
Gica78R
Senior Member
 
L'Avatar di Gica78R
 
Iscritto dal: Mar 2005
Cittā: /home/gica
Messaggi: 1653
[C] Puntatori void e confronti

Ciao a tutti!

Ho gia' chiesto su un altro forum circa questo problema, ma non ne sono venuto a capo.

Sono in ambiente Linux e sto usando la funzione
Codice:
void* shmat(int shmid, const void *shmaddr, int shmflag);
che aggancia un segmento di memoria condivisa allo spazio di indirizzi del processo chiamante, ma il discorso si puo' fare con qualsiasi funzione che ritorna un void*.

In un programma e' possibile fare questa cosa qui:
Codice:
if (shmat(<parametri>)<0)
   {
     ...
   }
else { ... }
e va tutto bene, nonostante si stia comparando un void* (il valore ritornato dalla funzione) con un int (lo zero). Inoltre il compilatore non da nessun avviso circa questo confronto. Il significato di quel codice e' di testare il valore di ritorno di shmat per vedere se c'e' stato un errore; infatti, la funzione ritorna -1 in caso di fallimento, o, in caso di successo, il puntatore al segmento di memoria agganciato.
Se pero' sono io a definire una mia funzione del tipo
Codice:
void* Funzione()
{ return -1; }
con il test
Codice:
if (Funzione()<0)
   { ... }
else { ... }
non si entra mai nel primo ramo dell' if ma sempre nell' else (perche' il valore riportato da Funzione() e' 0xFFFFFFFF, che e' maggiore di 0). Inoltre il compilatore mi avvisa che sto comparando un puntatore con un intero senza fare un cast.
Qualcuno sa spiegarmi come mai questa diversita' di comportamento tra la shmat e Funzione(), nonostante entrambe ritornino un void*?

Grazie,
Gica
Gica78R č offline   Rispondi citando il messaggio o parte di esso