Можно ли предположить, что указатель имеет размер int в C? - PullRequest
8 голосов
/ 01 января 2011

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

Ответы [ 7 ]

16 голосов
/ 01 января 2011

Нет.Указатель может быть больше или меньше целого размера.Если по какой-то причине вам нужно передать указатель как целое число (например, выполнение целого, а не указатель, арифметика), они гарантированно поместятся в intptr_t .

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

5 голосов
/ 01 января 2011

Нет, совсем нет.Многие компиляторы не имеют их одинакового размера.

3 голосов
/ 01 января 2011

Нет, особенно в 64-разрядных средах:

LP64 Это относится к * средам nix, но то же самое верно для окон для LLP64.

1 голос
/ 01 января 2011

Нет;на моем MacOS X 10.6.5.для машины значение int равно 32 битам, а указатель по умолчанию равен 64 битам.

Если вам нужно целое число подходящего размера для хранения указателя, используйте #include <inttypes.h> (или <stdint.h>) иuintptr_t - при условии, что у вас есть поддержка C99, или вы можете имитировать ее.

1 голос
/ 01 января 2011

Я думаю, что вы имеете в виду размер типов данных, определяемый платформой, а не языком C. Насколько мне известно, C не определяет какой-либо конкретный размер для типов данных. Ответ на ваш вопрос заключается в том, что вы не можете принять это, например, на win32 sizeof (int) == sizeof (указатель) == 4 байта, однако на win64 sizeof (int) == 4 и sizeof (указатель) == 8

1 голос
/ 01 января 2011

нет, но указатель должен быть того же размера, что и intptr_t.

0 голосов
/ 02 января 2011

Я считаю, что ядро ​​Linux передает указатели как unsigned long.Они гарантированно будут по крайней мере того же размера, что и указатель:)

...