C++指针值加固定偏移量得到非预期结果问题咨询
错误原因
- 你多写了一次取地址符
&,导致表达式类型完全偏离预期
你写的&AddressHelper::getInstance().GetBaseAddress()拿到的不是GetBaseAddress()返回的基址本身,而是这个返回值所在内存的地址。如果GetBaseAddress()返回的就是你需要的0x00007ff851cd3c68这个基址值,完全不需要加&取地址。 - 指针算术默认按指向类型的大小为单位,不是按字节计算
你取地址后得到的是指针类型,假设指向的是8字节大小的64位整数,加0x39EA0等效于加0x39EA0 * 8 = 0x1CF500字节,和你预期的直接加字节偏移的结果完全不一致。 - 对临时返回值取地址属于未定义行为
如果GetBaseAddress()是值返回(返回的是临时变量),对临时变量取地址是C++标准明确的未定义行为,运行结果完全不可控,这也是你每次得到的结果都不一样的原因。
修正方案
直接用返回的基址值做加法即可,如果你要确保加法是按字节偏移,可以先转成单字节指针类型再计算:
// 写法1:如果GetBaseAddress返回的本身就是指针类型 AddressHelper::getInstance().GetBaseAddress() + 0x39EA0; // 写法2:如果GetBaseAddress返回的是整数类型的地址值,转成字节指针再偏移 reinterpret_cast<uint8_t*>(AddressHelper::getInstance().GetBaseAddress()) + 0x39EA0;
另外补充:你自己的预期计算存在错误,0x00007ff851cd3c68 + 0x39EA0的正确结果是0x7FF851D0DA08,你之前算的7FF81350DB08是计算失误。
内容的提问来源于stack exchange,提问作者Irbis77
相关产品推荐
相关产品推荐

