Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 指针算术混乱或奇怪的行为_C++_Cl.exe - Fatal编程技术网

C++ 指针算术混乱或奇怪的行为

C++ 指针算术混乱或奇怪的行为,c++,cl.exe,C++,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) {

运行以下命令后,我发现_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*4L
否则乘法器将溢出。

我猜David的答案适用于某些编译器,但在Microsoft编译器中我仍然收到警告和相同的结果。在一些C++文档中我注意到“Load”只提供“至少32位的宽度”。因此,我将变量类型和表达式类型更改为long

long long _varLLxxLL = 0x400000B0 * 4LL;
std::cout << "_varLLxxLL has value " << _varLLxxLL 
          << ", the expression had type " << typeid(0x400000B0 * 4LL).name() << "\n";
long-long\u varLLxxLL=0x400000B0*4LL;

std::cout我猜David的答案适用于某些编译器,但在Microsoft编译器中,我仍然收到警告和相同的结果。在一些C++文档中我注意到“Load”只提供“至少32位的宽度”。因此,我将变量类型和表达式类型更改为long

long long _varLLxxLL = 0x400000B0 * 4LL;
std::cout << "_varLLxxLL has value " << _varLLxxLL 
          << ", the expression had type " << typeid(0x400000B0 * 4LL).name() << "\n";
long-long\u varLLxxLL=0x400000B0*4LL;

std::cout指针算法将类型大小考虑在内。还会发生对齐。OMG这是您正在分配的大量内存。您可能需要
0x400000B0*4L
,否则乘法可能会溢出。@DavidSchwartz这就是答案。@Michael yep,我现在看到有一个警告。吸取的教训。指针算法将类型大小考虑在内。还会发生对齐。OMG这是您正在分配的大量内存。您可能需要
0x400000B0*4L
,否则乘法可能会溢出。@DavidSchwartz这就是答案。@Michael yep,我现在看到有一个警告。吸取的教训。