2017-08-13 301 views
-1

我嘗試以下方法句柄轉換爲void *,然後返回到處理以下方式轉換uint64_t中爲void *和背部

uint64_t hInt = 154071804376; //assume this is a valid memory location 

void* hPoint = reinterpret_cast<void*>(hInt); 

uint64_t hIntBack = *static_cast<uint64_t*>(hPoint); unable to recover hInt here, getting some other number 140727986249696 

但是,如果我這樣做,我能恢復hInt

uint64_t hIntBack = reinterpret_cast<uint64_t>(hPoint) 

我不知道我明白這兩種方法之間的區別。

+0

'無效* H對準=的reinterpret_cast (HINT);'=>'無效* H對準=的reinterpret_cast (&hInt);' – user0042

+0

類似的問題到https://stackoverflow.com/questions/45657427/access-violation-casting-to-void-and-back –

回答

1

在此代碼:

uint64_t hIntBack = *static_cast<uint64_t*>(hPoint); unable to recover hInt here, getting some other number 140727986249696 

你實際上是在尋找的內存位置hPoint值。這是因爲您將其轉換爲uint64_t *,然後在該位置獲取該值。

作爲一個方面說明,雖然uint64_t可以在64位機器上正常工作,但是執行此類操作的標準方法是使用uintptr_t,它保證是您正在編譯的體系結構的指針大小。如果你要編譯一個非XX位機器上uintXX_t代碼時,編譯器會帶來錯誤

相關問題