2013-07-16 91 views
3

所以最近我一直在處理WinAPI的WriteProcessMemoryReadProcessMemory,它們都以LPVOID作爲它們的第二個參數,它是我們要讀取的另一個進程的內存中的實際地址。C++整數到指針轉換

考慮到,將這個整數指針轉換是正確的C++代碼(沒有未定義的行爲等):

#include <windows.h> 
int main() 
{ 
    WriteProcessMemory(/*...*/, 
     //want to read from memory address 0x1234 in the target process 
     reinterpret_cast<void*>(static_cast<uintptr_t>(0x1234)), 
     /*...*/); 

    return 0; 
} 

AFAIK,標準說uintptr_t是整數類型,其能夠保持沒有改變指針值的指針。由於它是一個整數,我應該能夠在其中存儲0x1234。該標準還規定reinterpret_castuintptr_tvoid*也將保持不變。

回答

1

在Windows平臺上,指針的存儲方式與相同的位數整數類型完全相同。區別在於編譯器如何解釋指針和int的值。所以不需要轉換。

將其轉換爲void */LPVOID只是爲了讓編譯器感到高興,並接受指針所在位置的整數值而不進行轉換。在這種情況下,通過static_cast + reinterpret_cast是矯枉過正的。

只要您確定正確的地址是0x1234,就不需要轉換。只是一個普通的(LPVOID)0x1234(void *)0x1234應該做的。

正如評論中指出的那樣,常量可能會被截斷。然後沒有轉換可以修復指針值。處理這種情況的一種方法是明確指定常量中使用的類型:

例如, (void *)0x1234567812345678ULL將會正常,因爲編譯器被指示使用64位無符號類型。

+0

如果我們無視我通常使用WinAPI或Windows,'reinterpret_cast (static_cast (0x1234))'仍然是將整數轉換爲void *的正確標準方法嗎? – Tuntuni

+0

這取決於你如何獲得指針值。如果你有一個指針,並執行'reinterpret_cast (static_cast (p))'然後輸出值 - 那麼是的。 – bbonev

+0

如果我有一個整數'我'並做'reinterpret_cast (static_cast (i))'? – Tuntuni