运行以下命令后,我会发现_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 15.9.2版,但是我不确定编译器的版本。

最佳答案

您需要0x400000B0 * 4L否则乘法将溢出。

关于c++ - 指针算术困惑或怪异行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54224350/

10-11 22:39