簡體   English   中英

指針算術混亂或奇怪的行為

[英]Pointer arithmetic confusion or weird behavior

當以下運行時,我得到 _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否則乘法將溢出。

兩個整數文字 0x400000B0 和 4 每個都只給出 4 個字節(即使在 x86-64 中也是如此),因此將它們相乘會導致溢出 附加 L's 不會改變任何東西。 附加 LL 使它們成為 64 位,並解決了問題。 但我的解決方案是從現在開始將 std::int64_t 用於整數。


測試:

#include <iostream>
#include <cassert>
using namespace std;

int main()
{
    { // plain literals
        float* const _pData = 0;
        float* const _floatPos = _pData + 0x400000B0;
        char* const _charPos = ((char*)_pData) + 0x400000B0 * 4;

        assert((char*)_floatPos != _charPos);
    }

    { // append L
        float* const _pData = 0;
        float* const _floatPos = _pData + 0x400000B0L;
        char* const _charPos = ((char*)_pData) + 0x400000B0L * 4L;

        assert((char*)_floatPos != _charPos);
    } 

    { // append LL
        float* const _pData = 0;
        float* const _floatPos = _pData + 0x400000B0L;
        char* const _charPos = ((char*)_pData) + 0x400000B0LL * 4LL;

        assert((char*)_floatPos == _charPos); // success
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM