2010-02-25 4 views
9

D'une question sur le Practice C test de GeekInterview, pourquoi est la taille de ptr1 2, alors que ptr2 et ptr3 sont la taille de 4?En utilisant C, pourquoi un type char * serait-il de taille 2 à un endroit, mais 4 à un autre?

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

Sortie: 2 4 4

+4

Wow, pointeurs proches et lointains. Ce sont les jours. Est-ce que quelqu'un l'utilise encore ou est-ce juste un test obsolète? –

+0

Ceci est assez obsolète, mais je parie que cela est toujours pertinent sur certains systèmes embarqués ... –

Répondre

9

Lorsque vous travaillez sur des architectures de mémoire segmentée (comme mode réel x86), on peut distinguer trois types d'adresses de pointeurs (exemples pour x86 dans le segment: notation offset):

  • près

    ne stocke que la partie décalée (qui est de 16 bits) - lors de la résolution d'un tel pointeur, le décalage du segment de données actuel sera utilisé comme adresse de segment.

  • loin

    secteur des magasins et l'adresse de décalage (16 bits chacun), définissant ainsi une adresse physique dans la mémoire absolue.

  • énorme

    même jusqu'à pointeur, mais peut être normalisé, à savoir 0000:FFFF + 1 sera enroulé autour de façon appropriée à l'adresse suivante du segment.

sur les systèmes d'exploitation modernes, cela n'importe plus que le modèle de mémoire est généralement plat, en utilisant la mémoire virtuelle au lieu d'aborder directement la mémoire physique (au moins dans l'anneau 3 applications).

+0

excellente réponse merci :) –

+0

x86 mode protégé prend en charge la segmentation. – caf

+0

@caf: Oui, mais j'ai choisi le mode réel comme meilleur exemple car en mode réel, toutes les applications devront traiter des adresses segmentées. – AndiDog

5

Parce que vous utilisez des pointeurs près vs far pointers. Un pointeur éloigné nécessite deux adresses de 16 bits, dans ce cas.

(Le spécificateur « énorme » est une syntaxe de pointeur loin non standard, pour traiter certains cas pointeur loin spécifiques ...)

+0

Génial, je vais rechercher les pointeurs 'near' et' far' pour mieux comprendre. –

+1

@Nick: Je ne voudrais pas déranger. C'est assez archaïque. – Novelocrat

+0

@Novelocrat Un de mes amis a dit que le test est Borland C, et certaines des questions ne sont pas très bien pensées. –

Questions connexes