offsetof与container_of宏分析 offsetof宏:结构体成员相对结构体的偏移位置 container_of:根据结构体成员的地址来获取结构体的地址

 

offsetof 宏

原型:

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

(TYPE *)0非常巧妙,告诉编译器有一个指向结构体 TYPE 的指针,其地址是0,然后取该指针的 MEMBER 地址 &((TYPE *)0)->MEMBER,因为基址是0,所以这时获取到的 MEMBER 的地址就是相当于在结构体 TYPE 中的偏移量了。
Example:

#include <stdlib.h> #include <stdio.h> #include <stddef.h>  struct TYPE{     int mem;     int member; };  int main() {     struct TYPE type;     printf("&type = %p\n", &type);     printf("&type.member = %p\n", &type.member);     printf("&((struct type *)0)->member = %lu\n", ((size_t)&((struct TYPE *)0)->member) );     printf("offsetof(struct TYPE member) = %zd\n", offsetof(struct TYPE, member));     return 0; } /* result: &type = 0x7ffc1104a110 &type.member = 0x7ffc1104a114 &((struct type *)0)->member = 4 offsetof(struct TYPE member) = 4 */

container_of 宏

原型:linux-4.18.5

                        
关键字:
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信