Chinaunix首页 | 论坛 | 博客
  • 博客访问: 360437
  • 博文数量: 79
  • 博客积分: 1270
  • 博客等级: 中尉
  • 技术积分: 1370
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-12 08:48
个人简介

freedom~~~~~~~~~~

文章分类

全部博文(79)

文章存档

2014年(10)

2013年(2)

2012年(13)

2011年(54)

分类: 嵌入式

2013-03-13 11:13:58

从offsetof说起
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)

上面是type结构体中,member在type中的偏移量,其中的关键就是对于数字0的强转,

把数字0强转成(type *)的结构体指针,那么这个指针的值,注意是指针的值就是0

比如int a =3;
int *p = (int *)a;

则P=3,即p的内容是3.
P指向空间的地址是3.

所以取(0->member)的地址就是相对0的便宜,就是偏移量

#define container_of(ptr, type, member) ({ \
const typeof(((type *)0)->member) * __mptr = (ptr); \                       ------申明一个member类型的指针,赋值为ptr
(type *)((char *)__mptr - offsetof(type, member)); })                        -------将ptr的值减去便宜量即为原结构体首地址,将值在转换为结构体类型的指针,即为结构体的首地址。




阅读(1416) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~