<2014年8月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
31123456

统计

  • 随笔 - 3
  • 文章 - 0
  • 评论 - 0
  • 引用 - 0

常用链接

留言簿

随笔档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜

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

posted on 2014-08-15 11:57 耳东晨 阅读(184) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理