将 void* 强制转换为任何内容的无效结果
invalid result in casting void* to anything
我将 double
之类的东西转换为 void*
并将其传递给另一个函数。但是当我想将 void*
转换为 double
时,我得到了错误的结果!!!类似于 9.18358-e10。
内存地址与上一个函数相同,sizeofvoid*
和double
相同。但铸造后的结果是错误的。
我试过 reinterpret_cast<>
, static_cast<>
, memcpy
,...但是没有任何反应。
怎么了??我应该怎么办?
代码
void* def_double(double* d){
void* v = d;
return v;
}
void print(void* v){
cout << *((double*) v) << endl;
}
注意:我在 bison 中使用这段代码来保存我的变量。
假设 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
我将 double
之类的东西转换为 void*
并将其传递给另一个函数。但是当我想将 void*
转换为 double
时,我得到了错误的结果!!!类似于 9.18358-e10。
内存地址与上一个函数相同,sizeofvoid*
和double
相同。但铸造后的结果是错误的。
我试过 reinterpret_cast<>
, static_cast<>
, memcpy
,...但是没有任何反应。
怎么了??我应该怎么办?
代码
void* def_double(double* d){
void* v = d;
return v;
}
void print(void* v){
cout << *((double*) v) << endl;
}
注意:我在 bison 中使用这段代码来保存我的变量。
假设 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