2010-02-25 9 views
9

De una pregunta en el Practice C test de GeekInterview, ¿por qué el tamaño de ptr1 2, mientras que ptr2 y ptr3 tienen un tamaño de 4?Usando C, ¿por qué un tipo de caracteres * sería del tamaño 2 en un lugar, pero 4 en otro?

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

de salida: 2 4 4

+4

Guau, punteros cercanos y lejanos. Esos fueron los días. ¿Alguien todavía está usando esto, o es solo una prueba obsoleta? –

+0

Esto está bastante desactualizado, pero apuesto a que esto sigue siendo relevante en algunos sistemas incorporados ... –

Respuesta

9

Cuando se trabaja en arquitecturas con memoria segmentada (como modo real x86), se puede distinguir tres tipos de direcciones de puntero (ejemplos para x86 en el segmento: notación offset):

  • cerca de

    almacena Sólo la parte de desplazamiento (que es de 16 bits) - al resolver un puntero tal, el desplazamiento del segmento de datos actual se usará como dirección de segmento.

  • lejos

    Tiendas segmento y de direcciones de desplazamiento (16 bits cada uno), definiendo así una dirección física absoluta en la memoria.

  • enorme

    Igual que el puntero el momento, pero puede ser normalizada, es decir 0000:FFFF + 1 será envuelto alrededor apropiadamente a la siguiente dirección de segmento.

En los sistemas operativos modernos esto no importa ya que el modelo de memoria es generalmente plana, utilizando la memoria virtual en lugar de abordar directamente la memoria física (al menos en el anillo 3 aplicaciones).

+0

excelente respuesta gracias :) –

+0

El modo protegido x86 aún admite la segmentación. – caf

+0

@caf: Sí, pero elegí el modo real como el mejor ejemplo porque en modo real todas las aplicaciones tendrán que ocuparse de direcciones segmentadas. – AndiDog

5

Debido a que usted está utilizando cerca de los punteros vs. far pointers. Un puntero lejano requiere dos direcciones de 16 bits, en este caso.

(El "enorme" especificador es una sintaxis más puntero no estándar, para el manejo de algunos casos específicos lejos del puntero ...)

+0

Impresionante, voy a investigar los indicadores 'near' y' far' para obtener una mejor comprensión. –

+1

@Nick: No me molestaría. Es bastante arcaico. – Novelocrat

+0

@Novelocrat Un amigo mío dijo que la prueba es Borland C, y algunas de las preguntas no están bien pensadas. –

Cuestiones relacionadas