先看如下代码,注意红色那行:

#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;

}

运行结果一下:

c语言的神奇用法

正常运行!没有崩溃!精确得到是变量t1在结构体的偏移量,也就是说当知道t1的地址可以通过减去偏移量获取结构体的地址,从而对结构体的其他成员访问

这种技巧可以让没有上下文参数提供下,函数入参(int n,test1 t1)与想操作函数结果(test2 *t2)对象绑定在一个结构体中(TestObject),通过偏移地址(t1 - 4)访问成员(t2),这样省去额外STL类似容器去管理对应绑定关系



相关文章: