#c #pointers #64-bit
#c #указатели #64-разрядный
Вопрос:
При использовании функции sizeof() в программах на c все рассмотренные мной указатели, похоже, возвращают размер 4 байта. Я видел в Интернете, что указатели — это просто целочисленные адреса памяти. Как это имеет смысл в 64-разрядных архитектурах, которые потенциально могли бы иметь адреса памяти, к которым нельзя получить доступ за 4 байта?
Комментарии:
1. В 64-битной архитектуре вы бы (вероятно) получили
sizeof(void*) == 8
.2. спасибо за ответ. Мой компьютер 64-разрядный, и он возвращает 4 для sizeof (void *)?
3. Затем вы компилируете для 32 бит. Проверьте параметры компилятора (или сообщите нам, какой компилятор вы используете).
4. Большинство современных 64-разрядных операционных систем поддерживают 32-разрядный режим для обеспечения обратной совместимости. Если
sizeof(void*) == 4
с вами, то вы, вероятно, ориентируетесь на 32-разрядную платформу, то есть ваша программа будет работать в 32-разрядном режиме. Проверьте документацию вашего компилятора о том, как создать 64-разрядную программу.5. en.wikipedia.org/wiki/64-bit_computing#64-bit_data_models
Ответ №1:
Большинство современных 64-разрядных операционных систем поддерживают 32-разрядный режим для обеспечения обратной совместимости. Если sizeof(void*) == 4
с вами, то вы, вероятно, ориентируетесь на 32-разрядную платформу вашей операционной системы, так что ваша программа будет работать в 32-разрядном режиме.
Проверьте документацию вашего компилятора о том, как настроить таргетинг на 64-разрядную платформу вашей операционной системы. Впоследствии вы должны это заметить sizeof(void*) == 8
.
Ответ №2:
Если указатели — это просто целые числа, содержащие адрес (4 байта — 32 бита), как они хранят дополнительные адреса в 64-разрядной памяти?
32-разрядный указатель не может хранить 64-разрядные адреса. Вот почему указатели имеют 64 бита в 64-разрядных системах.