Могу ли я преобразовать нулевой указатель типа int в длинный тип с помощью reinterpret_cast - PullRequest
9 голосов
/ 12 апреля 2011

int *pt = 0;<br> long i = reinterpret_cast<long>(pt);

Гарантированно ли я равен 0?Это хорошо определено или определяется реализацией?Я проверил стандарт c ++, но он только утверждает, что

Указатель на объект данных или функцию (но не указатель на член) может быть преобразован в любой целочисленный тип, достаточно большой, чтобы содержать его,

В этом случае pt не указывает ни на один объект данных.Применимо ли правило к этому делу?

Ответы [ 4 ]

8 голосов
/ 12 апреля 2011

Нет , i не обязательно любое значение.Результат определяется реализацией.

Представление указателей в C ++ определяется реализацией, включая представление нулевого указателя.Когда вы назначаете указателю целочисленное значение, равное нулю, вы устанавливаете этот указатель на значение нулевого указателя, определяемое реализацией *1009*, которое не обязательно равно нулю.Результат приведения этого значения к целому числу в силу транзитивности определяется реализацией.

Еще более проблематично то, что отображение, выполненное reinterpret_cast, в любом случае определяется реализацией.Таким образом, даже если значение нулевого указателя было все биты-ноль, реализация свободна, чтобы сделать результат, что он хочет.Вы только гарантируете, что получите исходное значение, когда вернётесь назад.

После всего сказанного следующее предложение после вашей цитаты содержит примечание:

[Примечание:Он предназначен для тех, кто знает структуру адресации базовой машины.- конец примечания]

Таким образом, даже если конкретные сопоставления не требуются, прагматично вы можете сделать обоснованное предположение.


Предполагая longдостаточно велик.В C ++ 0x используйте uintptr_t, опционально определенный в <cstddef>.

0 голосов
/ 12 апреля 2011

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

Я думаю, что у вас есть кодвыше безопасно хранит от 0 до 'i' на всех известных общих платформах.

0 голосов
/ 12 апреля 2011

Вы хотите reinterpret_cast (pt), но да, это будет работать. reinterpret_cast аналогичен старому приведению в стиле C (long) и предполагает, что вы знаете, что делаете.

0 голосов
/ 12 апреля 2011

Я не понимаю, почему это не так. Проблема заключается в том, что рассматриваемый целочисленный тип не сможет содержать столь высокие значения, но если это нулевой указатель, проблем нет.

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