offsetof宏

offsetof宏
最近读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作为起始地址,则成员地址自然为偏移地址; 

你可能感兴趣的:(offsetof宏)