3

所以最近我一直在处理 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_casting an uintptr_tto avoid*也将保持该值不变。

4

1 回答 1

1

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

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

只要您确定正确的地址是 0x1234,就不需要转换。只是一个普通的(LPVOID)0x1234(void *)0x1234应该做的。

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

例如(void *)0x1234567812345678ULL将没问题,因为编译器被指示使用 64 位无符号类型。

于 2013-07-17T00:04:44.930 回答