先看如下代码,注意红色那行:
#include<stdio.h>
struct test1
{
int a;
int b;
};
struct test2
{
int c;
};
struct TestObject
{
int n;
struct test1 t1;
struct test2* p2;
};
int main()
{
TestObject * obj = 0;
char * offset = ((char*)&(obj)->t1);
printf("offset:%ld,&obj:%ld\n",offset,(char*)&obj);
return 0;
}
运行结果一下:
正常运行!没有崩溃!精确得到是变量t1在结构体的偏移量,也就是说当知道t1的地址可以通过减去偏移量获取结构体的地址,从而对结构体的其他成员访问
这种技巧可以让没有上下文参数提供下,函数入参(int n,test1 t1)与想操作函数结果(test2 *t2)对象绑定在一个结构体中(TestObject),通过偏移地址(t1 - 4)访问成员(t2),这样省去额外STL类似容器去管理对应绑定关系