当 HWND 位于 bool 变量之前时,使用它们的内存位置访问变量 v2
时,我得到了错误的值。如果我在 bool 之后使用 HWND,那么我会得到正确的结果。使用实例变量 (t
) 我得到了 v1
和 v2
的正确值,例如 t->v1
和 t->v2
。我正在使用 Windows Server 2003。我有以下测试类。这只能在 64 位操作系统中重现; 32 位操作系统运行良好。
#include "conio.h"
#include "stdio.h"
include "windows.h"
class Test
{
public :
Test()
{
v1=12345678;
v2=87654321;
}
HWND hWnd;
bool MsgHandled;
unsigned long v1;
unsigned long v2;
};
int _tmain(int argc, _TCHAR* argv[])
{
Test* t=new Test();
unsigned long sign1 = *(unsigned long*)((unsigned char*)t + sizeof(Test)-2*sizeof(unsigned long));
unsigned long sign2 = *(unsigned long*)((unsigned char*)t + sizeof(Test)-sizeof(unsigned long));
printf("\nTest size %d",sizeof(Test));
printf("\n t->v1 %d",t->v1);
printf("\n t->v2 %d",t->v2);
printf("\n v 1 %d",sign1);
printf("\n v 2 %d",sign2); // garbage value in 64 bit os
getch();
return 0;
}
最佳答案
您似乎假设您的 v1
和 v2
必须恰好位于 Test
类型对象的末尾。这是一个完全没有根据的假设。该语言没有做出这样的保证,在一般情况下他们不会。该对象通常以填充字节结尾。这些填充字节是您在代码中实际读取的内容。难怪它们含有垃圾。
填充字节被添加到对象以满足它们的对齐要求。由于在从 32 位模式切换到 64 位模式时对齐要求可能(并且将会)发生变化,因此在不同模式下编译代码时得到不同的结果也就不足为奇了。
关于c++ - 通过内存位置访问变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3903898/