C++ 指针算术混乱或奇怪的行为
运行以下命令后,我发现_pfloatPos和_charPos不同: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) {
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,我现在看到有一个警告。吸取的教训。