最近读libuv源码,看到了ngx_queue_t,里边用到了offsetof,第一次看到,网上查了一下,原来是获取struct成员内存地址相对于struct地址的偏移量,今儿想到了怎么实现的呢。
struct A {
int i;
char c;
float f;
};
A* a = (A*)0;
size_t offset = (size_t)&(a->c);
printf("%lu\n", offset);
#define offsetof(TYPE, MEMBER) ((size_t) & ((TYPE *)0)->MEMBER )
一共4步
1. ( (TYPE *)0 ) 将零转型为TYPE类型指针;
2. ((TYPE *)0)->MEMBER 访问结构中的数据成员;
3. &( ( (TYPE *)0 )->MEMBER )取出数据成员的地址;
4.(size_t)(&(((TYPE*)0)->MEMBER))结果转换类型.巧妙之处在于将0转换成(TYPE*),结构以内存空间首地址0作为起始地址,则成员地址自然为偏移地址;