所以我在我的C ++应用程序中使用这个C库,其中一个函数返回void *。现在我对纯C来说并不是最敏锐的,但是听说过一个void *可以被投射到几乎任何其他的*类型。我也知道我希望在这个函数的某个地方有一个浮点数。
所以我将void *转换为float *并取消引用float *,崩溃。该死的!
我调试代码并在gdb中让它评估(float)voidPtr
和低,看看这个值是我期望和需要的!
但是等等,在编译期间不可能这样做。如果我写float number = (float)voidPtr;
它不编译,这是可以理解的。
所以现在问题是,我如何让我的浮动脱离这个虚弱的空白*?
编辑:感谢H2CO3,这已经解决了,但我看到很多答案和评论出现并且不再相信我可以在gdb中做(浮动)voidPtr。这是截图。
答案 0 :(得分:12)
尝试使用指针:
void *theValueAsVoidPtr = // whatever
float flt = *(float *)&theValueAsVoidPtr;
答案 1 :(得分:8)
如果我理解正确,你的库会在声明类型为void *
的变量中返回一个float 值。最安全的方法是使用union
:
#include <assert.h>
static_assert(sizeof(float) == sizeof(void *));
union extract_float {
float vf;
void * vp;
};
float foo(...)
{
union extract_float ef;
ef.vp = problematic_library_call(...);
return ef.vf;
}
与接受的答案中的方法不同,这不会触发未定义的行为。