作者:左轻侯
583字节
点击:27103
回复:1545
所属分类:技术随笔
前几天,在developerworks上偶然看到一篇文章:
http://www.ibm.com/developerworks/cn/linux/kernel/l-chain/
看了个开头,觉得这个实现思路有点奇怪,如果链表结构不包含数据,而是让数据包含链表结构,那么怎么通过指向链表结构的指针,获得包含它的数据的地址呢?
看下来,果然发现了答案,其实很简单:
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
把0强制转换成指向数据类型的指针,再把它的成员的地址强制转换成数字,就得到了成员在结构体中的偏移量。
有一点点too smart,有一点点hack,但这是linux内核的基础数据结构。
今天突然又发现,这种实现思路,貌似还是其它很多软件的基础。