Используя C, почему тип char * будет иметь размер 2 в одном месте, а 4 в другом? - PullRequest
9 голосов
/ 25 февраля 2010

Из вопроса о Практическом тесте C от GeekInterview, почему размер ptr1 2, а ptr2 и ptr3 - размер 4?

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

Выход: 2 4 4

Ответы [ 2 ]

9 голосов
/ 25 февраля 2010

При работе с архитектурами с сегментированной памятью (например, в реальном режиме x86) можно выделить три типа адресов указателей (примеры для x86 в сегменте: смещение):

  • рядом

    Сохраняет только часть смещения (которая является 16-битной) - при разрешении такого указателя текущее смещение сегмента данных будет использоваться в качестве адреса сегмента.

  • * до 1014 *

    Сохраняет адрес сегмента и смещения (16 бит каждый), таким образом определяя абсолютный физический адрес в памяти.

  • огромный

    То же самое, что и указатель на дальность, но может быть нормализовано, то есть 0000:FFFF + 1 будет соответствующим образом перенесено на адрес следующего сегмента.

В современных ОС это больше не имеет значения, поскольку модель памяти обычно плоская, с использованием виртуальной памяти вместо прямого обращения к физической памяти (по крайней мере, в приложениях кольца 3).

5 голосов
/ 25 февраля 2010

Потому что вы используете ближние указатели против дальние указатели . В этом случае для дальнего указателя требуются два 16-битных адреса.

(«Огромный» спецификатор - это нестандартный синтаксис дальнего указателя для обработки некоторых особых случаев дальнего указателя ...)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...