C ++指向转换的整数

时间:2013-07-16 23:47:09

标签: c++ winapi pointers

所以最近我一直在处理WinAPI的WriteProcessMemoryReadProcessMemory,它们都将LPVOID作为第二个参数,这是我们想要读取的另一个进程的内存中的实际地址从

考虑到这一点,这个整数到指针的转换是正确的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_cast uintptr_tvoid*也会保持价值不变。

1 个答案:

答案 0 :(得分:1)

在Windows平台上,指针的存储方式与相同的位数整数类型完全相同。不同之处在于编译器如何解释指针和int的值。所以不需要转换。

将其强制转换为void * / LPVOID只是为了使编译器满意并接受指针位置的整数值而不进行转换。在这种情况下,通过static_cast + reinterpret_cast是过度的。

只要您确定正确的地址是0x1234,就不需要转换。只需简单的(LPVOID)0x1234(void *)0x1234即可。

[edit]如评论中所述,常量可能会被截断。然后没有转换可以修复指针值。处理此问题的方法是明确指定常量中使用的类型:

E.g。 (void *)0x1234567812345678ULL将正常,因为指示编译器使用64位无符号类型。