2010-02-25 8 views
9

Da una domanda sullo Practice C test da GeekInterview, perché le dimensioni di ptr1 2, mentre ptr2 e ptr3 sono di dimensione 4?Usando C, perché un tipo char * può essere di dimensione 2 in un posto, ma 4 in un altro?

main() 
{ 
char near * near *ptr1; 
char near * far *ptr2; 
char near * huge *ptr3; 
printf("%d %d %d",sizeof(ptr1),sizeof(ptr2),sizeof(ptr3)); 
} 

di uscita: 2 4 4

+4

Wow, puntatori vicini e lontani. Quelli erano i giorni. Qualcuno sta ancora usando questo, o è solo un test obsoleto? –

+0

Questo è abbastanza obsoleto, ma scommetto che questo è ancora rilevante su alcuni sistemi embedded ... –

risposta

9

Quando si lavora su architetture con memoria segmentata (come modalità reale x 86), si può distinguere tre tipi di indirizzi di puntatore (esempi per x86 a segmento: la notazione offset):

  • vicino

    memorizza solo la parte di offset (che è a 16 bit) - quando si risolve un tale puntatore,l'offset del segmento di dati corrente verrà utilizzato come indirizzo di segmento.

  • lontano

    magazzini segmento e indirizzo di offset (16 bit ciascuna), definendo così un indirizzo fisico assoluto in memoria.

  • enorme

    Come puntatore esterno, ma può essere normalizzato, cioè 0000:FFFF + 1 saranno opportunamente avvolto intorno al successivo indirizzo segmento.

Su sistemi operativi moderni questo non importa più come il modello di memoria è generalmente piatta, utilizzando la memoria virtuale invece di indirizzamento memoria fisica direttamente (almeno nell'anello 3 applicazioni).

+0

ottima risposta, grazie :) –

+0

la modalità protetta x86 supporta ancora la segmentazione. – caf

+0

@caf: Sì, ma ho scelto la modalità reale come esempio migliore perché in modalità reale tutte le applicazioni dovranno gestire indirizzi segmentati. – AndiDog

5

Perché stai usando vicino puntatori vs. far pointers. Un puntatore lontano richiede due indirizzi a 16 bit, in questo caso.

(L'identificatore "enorme" è una sintassi puntatore lontano non standard, per la gestione di alcuni casi specifici puntatore far ...)

+0

Impressionante, cercherò "near' e' lontano' i puntatori per ottenere una migliore comprensione. –

+1

@Nick: non mi preoccuperei. È piuttosto arcaico. – Novelocrat

+0

@Novelocrat Un mio amico ha detto che il test è Borland C, e alcune delle domande non sono molto ben pensate. –

Problemi correlati