c++ - 指针算术困惑或奇怪的行为

标签 c++ overflow integer-overflow cl.exe

运行以下命令后,我得到 _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/

相关文章:

CSS:iframe 不显示 100% 高度...更像是 100px 高度

swift - 如何在 Swift 中捕获算术溢出错误?

c++ - 用户定义的转换无法指定返回类型

c++ - 通过提供 DLLName 定位 DLL 路径

css - 如何将元素拖出水平滚动容器?

html - 隐藏的 CSS 溢出导致文本对齐问题

c++ - 执行时溢出/下溢是未定义的行为吗?

c - 是否有一个C代码片段,可以在不使用编译器内置函数的情况下有效地计算溢出安全加法?

c++ - 使用boost的timed_wait?

Mac 上的 C++ 内存清理