Я использую 64-разрядную машину ubuntu (x86_64).
Мой старший сказал, что в C размер программы любого указателя всегда равен размеру int. Правильно ли это?
Но когда я выполняю sizeof(int)
Я получаю 4 байта и за sizeof(int*)
Я получаю 8.
1. Почему я получаю 4 байта для sizeof(int)
в моем x86_64?Размер указателя всегда равен размеру int в компиляторе C. Правильно ли это?
ответ
Мой старший сказал, что в C размер программы любого указателя всегда равен размеру int. Правильно ли это?
НЕТ, это не так..
multiple different memory models possible, часто в той же системе в то же время. Часто системы поддерживают процессы ILP32 и LP64 в одно и то же время. В то время как int
имеет 4 байта (32 бита) как в ILP32, так и в LP64, указатели имеют 8 байтов (64 бит) в LP64.
Нет, это неверно.
Ваш «старший» ошибается. Ваш компилятор прав (очевидно).
Размер int
и размер указателя варьируются между платформами, и они не обязательно одинаковы. Действительно, на современном 64-битном потребительском оборудовании вы, вероятно, найдете 32-разрядные int
и 64-разрядные указатели.
Целый тип, который может содержать указатель, равен intptr_t
, определенному в <stdint.h>
.
Это не ответ, а комментарий. –
Это хорошая информация, все равно. –
Нет указаний на то, чтобы указатели всегда были того же размера, что и int
. На самом деле, указатели на разные типы не должны быть одинакового размера, как друг с другом:
6.2.5 Типы
...
28 Указательvoid
должен иметь те же требования к представлению и выравниванию, что и указатель на тип символа. 48) Аналогично, указатели на квалифицированные или неквалифицированные версии совместимых типов должны иметь одинаковые требования к представлению и выравниванию. Все указатели на типы структуры должны иметь одинаковые требования к представлению и согласованию друг с другом. Все указатели на типы объединения должны иметь одинаковые требования к представлению и согласованию друг с другом. Указатели на другие типы не должны иметь одинаковые требования к представлению или выравниванию.
48) Те же требования к представлению и выравниванию подразумевают взаимозаменяемость в качестве аргументов функций, возвращают значения из функций и членов профсоюзов.
Для C++ см. Раздел 3.9.2, пункт 3, online C++ Standard.
На 32-разрядных машинах для типов указателей и int
используется одинаковый размер, но это не универсально (особенно при переходе к 64-разрядным архитектурам).
- 1. Размер указателя целочисленного типа vs Размер int *
- 2. Размер массива всегда равен десяти
- 3. C# aes encryption: Размер входного файла не равен размеру
- 4. byte [] размер массива равен фактическому размеру массива в C#?
- 5. Максимальный размер массива равен размеру ОЗУ?
- 6. Объект C# равен int не равен true
- 7. Размер указателя в C
- 8. C++ reinterpret_cast - это всегда будет работать правильно?
- 9. scrollView размер границ всегда равен нулю
- 10. Каков размер указателя на массив типа int?
- 11. Синтаксис указателя строки, это правильно?
- 12. QWidget - Всегда изменять размер по размеру окна
- 13. OpenCV2 findContours(), контуры размер не равен размеру иерархии
- 14. Размер упакованной структуры в C, это правильно?
- 15. Размер int и sizeof указателя int на 64-битной машине
- 16. Правильно ли это в C++
- 17. Как создать массив, размер которого равен размеру файла?
- 18. Размер указателя в C
- 19. Размер приложения на устройстве равен окончательному размеру в магазине приложений?
- 20. В C мой выход функции всегда равен 0,000000. Это потому, что два входа являются int?
- 21. C: main() возврат массива всегда равен 56
- 22. Могу ли я предположить, что размер long int всегда равен 4 байтам?
- 23. Правильно ли это заголовок C?
- 24. UIButton размер кадра всегда равен нулю
- 25. Проверить, равен ли к Int
- 26. использование Int указателя в C
- 27. Почему размер байтового массива не равен размеру строк?
- 28. Печать содержимого указателя int всегда печатается -2
- 29. Инициализация Int указателя в C
- 30. Является ли это ошибкой в компиляторе Typcript
Ваш старший был неправ. – user694733
google дает лучшие ответы, тогда ваш старший;) – Tejendra
'sizeof (int)' зависит от вашего компилятора – kuro