c++ - 通过内存位置访问变量

标签 c++

当 HWND 位于 bool 变量之前时,使用它们的内存位置访问变量 v2 时,我得到了错误的值。如果我在 bool 之后使用 HWND,那么我会得到正确的结果。使用实例变量 (t) 我得到了 v1v2 的正确值,例如 t->v1t->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;
}

最佳答案

您似乎假设您的 v1v2 必须恰好位于 Test 类型对象的末尾。这是一个完全没有根据的假设。该语言没有做出这样的保证,在一般情况下他们不会。该对象通常以填充字节结尾。这些填充字节是您在代码中实际读取的内容。难怪它们含有垃圾。

填充字节被添加到对象以满足它们的对齐要求。由于在从 32 位模式切换到 64 位模式时对齐要求可能(并且将会)发生变化,因此在不同模式下编译代码时得到不同的结果也就不足为奇了。

关于c++ - 通过内存位置访问变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3903898/

相关文章:

c++ - boost aligned_allocator 对齐参数不影响实际对齐

c++ - 成员函数模板,其参数数量取决于一个完整的模板参数

c++ - C++ streambuf 方法可以抛出异常吗?

c++ - 如何在构造函数中初始化对象数组?

c++ - 修改指向另一个指针的指针

c++ - 使用 std::cin 中的 std::setw 限制输入大小

c++ - boost 函数和 boost lambda

c++ - 大小可变的函数中数组的内存注意事项

c++ - 我如何获得指向调用 (Q)Object 的方法的指针?

c++ - 使用带有仅 header 的 CMake 项目的 clang-tidy