C ++: безопасно ли приводить указатель на int, а затем снова возвращать указатель? - PullRequest
24 голосов
/ 25 августа 2010

Безопасно ли приводить указатель к int, а затем снова к указателю?

Как насчет того, чтобы знать, является ли указатель 32-битным и int 32-битным?

long* juggle(long* p) {
    static_assert(sizeof(long*) == sizeof(int));
    int v = reinterpret_cast<int>(p); // or if sizeof(*)==8 choose long here
    do_some_math(v); // prevent compiler from optimizing
    return reinterpret_cast<long*>(v);
}

int main() {
    long* stuff = new long(42);
    long* ffuts = juggle(stuff); 
    std::cout << "Is this always 42? " << *ffuts << std::endl;
}

Охвачено ли это стандартом?

Ответы [ 12 ]

0 голосов
/ 25 августа 2010

Нет, это не так.Даже если мы исключаем проблему архитектуры, размер указателя и целое число имеют различия.В С ++ указатель может быть трех типов: ближний, дальний и огромный.У них разные размеры.И если мы говорим о целых числах, то обычно это 16 или 32 бит.Поэтому забрасывать целые числа в указатели и наоборот не безопасно.Необходимо соблюдать крайнюю осторожность, так как есть очень большая вероятность потери точности.В большинстве случаев целому числу будет недостаточно места для хранения указателя, что приведет к потере значения.

0 голосов
/ 25 августа 2010

Используйте uintptr_t из "stdint.h" или из "boost / stdint.h".Гарантированно достаточно места для указателя.

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