2016-04-29 1 views
2

Я использую 64-разрядную машину ubuntu (x86_64).
Мой старший сказал, что в C размер программы любого указателя всегда равен размеру int. Правильно ли это?
Но когда я выполняю sizeof(int) Я получаю 4 байта и за sizeof(int*) Я получаю 8.
1. Почему я получаю 4 байта для sizeof(int) в моем x86_64?Размер указателя всегда равен размеру int в компиляторе C. Правильно ли это?

+14

Ваш старший был неправ. – user694733

+4

google дает лучшие ответы, тогда ваш старший;) – Tejendra

+2

'sizeof (int)' зависит от вашего компилятора – kuro

ответ

10

Мой старший сказал, что в C размер программы любого указателя всегда равен размеру int. Правильно ли это?

НЕТ, это не так..

multiple different memory models possible, часто в той же системе в то же время. Часто системы поддерживают процессы ILP32 и LP64 в одно и то же время. В то время как int имеет 4 байта (32 бита) как в ILP32, так и в LP64, указатели имеют 8 байтов (64 бит) в LP64.

9

Нет, это неверно.

Ваш «старший» ошибается. Ваш компилятор прав (очевидно).

Размер int и размер указателя варьируются между платформами, и они не обязательно одинаковы. Действительно, на современном 64-битном потребительском оборудовании вы, вероятно, найдете 32-разрядные int и 64-разрядные указатели.

1

Целый тип, который может содержать указатель, равен intptr_t, определенному в <stdint.h>.

+1

Это не ответ, а комментарий. –

+0

Это хорошая информация, все равно. –

5

Нет указаний на то, чтобы указатели всегда были того же размера, что и int. На самом деле, указатели на разные типы не должны быть одинакового размера, как друг с другом:

Online C 2011 Standard

6.2.5 Типы
...
28 Указатель void должен иметь те же требования к представлению и выравниванию, что и указатель на тип символа. 48) Аналогично, указатели на квалифицированные или неквалифицированные версии совместимых типов должны иметь одинаковые требования к представлению и выравниванию. Все указатели на типы структуры должны иметь одинаковые требования к представлению и согласованию друг с другом. Все указатели на типы объединения должны иметь одинаковые требования к представлению и согласованию друг с другом. Указатели на другие типы не должны иметь одинаковые требования к представлению или выравниванию.
48) Те же требования к представлению и выравниванию подразумевают взаимозаменяемость в качестве аргументов функций, возвращают значения из функций и членов профсоюзов.

Для C++ см. Раздел 3.9.2, пункт 3, online C++ Standard.

На 32-разрядных машинах для типов указателей и int используется одинаковый размер, но это не универсально (особенно при переходе к 64-разрядным архитектурам).

Смежные вопросы