所以最近我一直在处理WinAPI的WriteProcessMemory
和ReadProcessMemory
,它们都将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_t
到void*
也会保持价值不变。
答案 0 :(得分:1)
在Windows平台上,指针的存储方式与相同的位数整数类型完全相同。不同之处在于编译器如何解释指针和int的值。所以不需要转换。
将其强制转换为void *
/ LPVOID
只是为了使编译器满意并接受指针位置的整数值而不进行转换。在这种情况下,通过static_cast + reinterpret_cast是过度的。
只要您确定正确的地址是0x1234,就不需要转换。只需简单的(LPVOID)0x1234
或(void *)0x1234
即可。
[edit]如评论中所述,常量可能会被截断。然后没有转换可以修复指针值。处理此问题的方法是明确指定常量中使用的类型:
E.g。 (void *)0x1234567812345678ULL
将正常,因为指示编译器使用64位无符号类型。