运行以下命令后,我得到 _pfloatPos 和 _charPos 不同:
float* const _pData = new float[0x50000000];
float* const _floatPos = _pData + 0x400000B0;
char* const _charPos = ((char*)_pData) + 0x400000B0 * 4;
if ((char*)_floatPos != _charPos)
{
throw "Derp.";
}
也许我脑子有雾,错过了一些基本的东西。两个地址应该一样吧?
我看了下反汇编。 1000002C0h 是 4 * 0x400000B0。对于第二个,它似乎在某些时候被截断了。
float* const _floatPos = _pData + 0x400000B0;
00007FF7CE48F6E2 mov rax,1000002C0h
00007FF7CE48F6EC mov rcx,qword ptr [_pData]
00007FF7CE48F6F0 add rcx,rax
00007FF7CE48F6F3 mov rax,rcx
00007FF7CE48F6F6 mov qword ptr [_floatPos],rax
char* const _charPos = ((char*)_pData) + 0x400000B0 * 4;
00007FF7CE48F6FA mov rax,qword ptr [_pData]
00007FF7CE48F6FE add rax,2C0h
00007FF7CE48F704 mov qword ptr [_charPos],rax
我使用的是 visual Studio 2017 Version 15.9.2,但我不确定编译器的版本。
最佳答案
您需要 0x400000B0 * 4L
否则乘法会溢出。
关于c++ - 指针算术困惑或奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54224350/