PDA

View Full Version : c = (type) func(param1, ...);


masteryuri
10-04-2012, 11:59
Qualcuno mi spiega questa sintassi?

addr1 = (char *) shmat (shmid1, 0, 0);

Dove addr1 è definito come
char * addr1

Il mio problema è capire quel (char *) che in teoria avrei anche compreso, dato che addr1 si aspetta un puntatore a carattere e non a void (cosa restituita in genere dalla shmat).
Ma in pratica cosa fa? Opera una conversione sul valore restituito? In che modo? Ha un nome questa tecnica?

Ringrazio anticipatamente chiunque vorrà illuminarmi. :)

[Kendall]
10-04-2012, 12:41
Qualcuno mi spiega questa sintassi?

addr1 = (char *) shmat (shmid1, 0, 0);

Dove addr1 è definito come
char * addr1

Il mio problema è capire quel (char *) che in teoria avrei anche compreso, dato che addr1 si aspetta un puntatore a carattere e non a void (cosa restituita in genere dalla shmat).
Ma in pratica cosa fa? Opera una conversione sul valore restituito? In che modo? Ha un nome questa tecnica?

Ringrazio anticipatamente chiunque vorrà illuminarmi. :)

Non conosco nel caso specifico la funzione shmat(...), ma l'operazione della quale parli si chiama casting esplicito. Il tipo restituito dalla funzione, da quel che dici è un puntatore a void, ergo ricopre bene o male il ruolo di restituire un indirizzo di memoria allo stato grezzo (nel senso che essendo di tipo void non puoi dereferenziarlo in quanto il compilatore non può conoscere la quantità di memoria da leggere). Se però il programmatore sa che quel puntatore si riferisce sicuramente all'indirizzo di un char (come nel tuo esempio), può operare una operazione di casting esplicita, forzando il compilatore a trattare quel puntatore come un puntatore a char. Suona un po' come un: "Ehi, fidati di me, ti assicuro che lì c'è un char quindi trattalo come tale".
Ovviamente la conversione deve essere fatta con coscienza, perchè nel caso in cui la memoria puntata non contenga byte effettivamente di un char, tu andrai a leggere una sequenza di byte casuale e pertanto il tuo programma avrà un comportamento imprevedibile.

masteryuri
10-04-2012, 13:08
Avevo immaginato bene dunque, ti ringrazio :)