繁体   English   中英

void *实际上是浮动的,该如何投射?

[英]void* is literally float, how to cast?

因此,我在C ++应用程序中使用了这个C库,其中一个函数返回void *。 现在我对纯C并不是最精明的,但是听说可以将void *转换为几乎所有其他*类型。 我也知道我希望此函数的结尾处有一个浮点数。

因此,我将void *强制转换为float *,然后取消引用float *,导致崩溃。 该死! 我调试了代码,并在gdb中让它评估(float)voidPtr和low,并认为该值是我期望和需要的!

但是,等等,在编译期间不可能做到相同。 如果我写float number = (float)voidPtr; 它不会编译,这是可以理解的。

因此,现在的问题是,如何使我的漂浮物摆脱这个充满欺骗性的空白*?

编辑:由于使用了H2CO3,因此得以解决,但是我看到很多答案和评论出现,并且在不相信我可以在gdb中做到(float)voidPtr的情况下消失。 这是屏幕截图。

在此处输入图片说明

尝试使用指针:

void *theValueAsVoidPtr = // whatever

float flt = *(float *)&theValueAsVoidPtr;

如果我理解正确,则您的库将在声明的类型为void *的变量中返回浮点 再次收回它的最安全方法是使用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;
}

与接受的答案中的方法不同,这不会触发未定义的行为。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM