View Single Post
Old 05-07-2005, 21:04   #1
71104
Bannato
 
L'Avatar di 71104
 
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7027
puntatori NEAR e FAR: perché non esistono più?

è da un po' che rifletto su questa cosa: sugli odierni processori di tipo Intel a 32 bit, qualsiasi puntatore da 32 bit è NEAR: un puntatore FAR infatti richiede 48 bit.
in Visual C++ (e credo anche in qualsiasi altro compilatore C/C++) l'asterisco, che serve a dichiarare puntatori, definisce sempre un tipo a 32 bit: sizeof(void*) infatti è uguale a 32, come anche sizeof(char*), sizeof(int*) e sizeof(<tipo_qualsiasi>*); ma i puntatori FAR che fine hanno fatto??
immaginiamo di avere un bel programma che viene distribuito su 4 segmenti: codice, dati, heap e stack (situazione tipica); se ho un puntatore ad un byte che sta nel segmento dati posso riferirmi a quel byte con soli 32 bit, e lo stesso se si trova nell'heap, ma come fa il compilatore a sapere il segmento a cui voglio riferirmi (heap o dati) quando la situazione non lo rende implicito?
e un'altra cosa: è risaputo che l'indirizzo 0x00000000, cioè NULL, non è accessibile: ma perché mai questa cosa??? si tratta semplicemente di un puntatore che punta al base address di qualche segmento, a seconda che io in un puntatore FAR (appunto) specifichi il segmento dati, codice, heap o stack, ma il punto è che di qualunque segmento si tratti, se il segmento sta nel mio programma in teoria io dovrei avere lecito accesso al suo byte numero 0, o sbaglio?!?
quello che in realtà può provocare il seg.fault è quando io specifico o un segmento inesistente, o un segmento di un altro programma, no?
cos'è che mi manca di sapere e che mi impedisce di capire?
71104 è offline   Rispondi citando il messaggio o parte di esso