类的成员变量在内存分部情况,是按类设计时,代码的顺序产生的,所以第一个成员变量的地址一般都是类对象实例的首地址,而这后的成员变量地址偏移,则是根据数据实际的内存上长度来偏移。(这里之所以说一般性,是因为有虚函数的类的首地址是一个虚函数表的指针,这时要取第一个成员变量,需要偏移一个指针的内存宽度)
例:
class A
{
private:
int
m_i;
char m_str[10];
}
class B
{
public:
virtual fun();
virtual fun1();
private:
int
m_i;
char m_str[10];
}
A a;
B b;
//给m_i赋值100
*((int*)(&a)) = 100;
*((int*)((char*)(&b) + sizeof(void*))) = 100;//多加一个指针的宽度
//给m_str赋值"test"
char* pStrA = (char*)(&a) + sizeof(int) ;
char* pStrB = (char*)(&b) + sizeof(void*) + sizeof(int);//多加一个指针的宽度
sprintf_s( pStrA , 10 , "test");
sprintf_s( pStrB , 10 , "test");
以上只是实验性的,实际情况要复杂的多少,要考虑到内存对齐的原则,变量的内存宽度是受影响的,所以想要真正做到强行访问私有成员变量,需要非常了解源代码的结构。