簡體   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