недействительный результат в приведении void * к чему-либо - PullRequest
0 голосов
/ 01 мая 2018

Я приведу что-то вроде double к void* и передам другую функцию. но когда я хочу привести свой void* к double, я получил неправильный результат !!! что-то вроде 9.18358-е10.

адрес памяти такой же, как в предыдущей функции, размер void* и double одинаков. но результат после кастинга неверный.

Я пытался reinterpret_cast<>, static_cast<>, memcpy, ... но ничего не произошло.

что не так ?? что я должен делать?

Код

void* def_double(double* d){
    void* v = d;
    return v;
}

void print(void* v){
    cout << *((double*) v) << endl;
}

примечание: я использую этот код в бизоне для сохранения своих переменных.

1 Ответ

0 голосов
/ 01 мая 2018

При условии, что void* не меньше, чем double (что будет в 64-битном приложении, но не в 32-битном приложении), вы можете использовать memcpy() для хранения битов значения double внутри битов указателя void*, например:

#include <iostream>
#include <cstring>

void doIt(void *p)
{
    double d;
    std::memcpy(&d, &p, sizeof(double));
    std::cout << "After: " << d << std::endl;
}

int main() {
    static_assert(sizeof(void*) >= sizeof(double), "void* is not large enough!");

    double d = 123.45;
    std::cout << "Before: " << d << std::endl;

    void *p = nullptr;
    std::memcpy(&p, &d, sizeof(double));
    doIt(p);

    return 0;
}
Before: 123.45
After: 123.45

Live Demo

...