2013年7月19日 星期五

[Linux] offsetof(TYPE, MEMBER)

offsetof(TYPE, MEMBER)
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER); 
分析:
========================================================================
(TYPE *)0, 將0強制轉型為TYPE型態指標,
p = (TYPE *)0, p是指向TYPE的指標, 值為0.
p->MEMBER就是MEMBER這個元素了, 而&(p->MEMBER)就是MEMBER的位址, 其base address是0, 如此一來就巧妙的轉化為TYPE中的偏移量. 再把結果強制轉換為size_t 就ok了, size_t 其實就是int.

typedef __kernel_size_t  size_t;
typedef unsigned int __kernel_size_t; 

可見 offsetof 的作用就是求出MEMBER在TYPE中的偏移量.

Reference: http://blog.csdn.net/sfrysh/article/details/5761148

沒有留言:

張貼留言