offsetof:offsetof 详解

1. 简介

offsetof 本质上是 linux 内核的一个宏函数,其作用是获取结构体中某个成员相对于结构体起始地址的偏移量。

2. 源码分析

内核源码:

path:kernel/msm-5.4/include/linux/stddef.h #define offsetof(TYPE, MEMBER) ((size_t)&((TYPE *)0)->MEMBER)

1. (type *)0,可以理解为把 0 地址强制转换为 type 结构体类型的指针,此时 0 就成了 type 结构体的首地址,指向该结构体,既然为结构体指针,那么自然可以引用该结构体的成员,所以 (type *)0)->member 的整体意义就是引用 type 结构体的成员 member。

2. &(type *)0)->member) 便是取该结构体成员 member 的地址。而结构体起始地址为 0 时,结构体成员的地址为多少,其相对于结构体的偏移量就为多少。所以此时结构体类型成员的地址就是该成员相对结构体起始地址的偏移量。

3. 经过上面的分析之后,这段代码的逻辑就很简单了,通过 &((TYPE *)0)->MEMBER) 先取 TYPE 结构体类型成员的地址,强制转换成 size_t 类型后返回结构体类型成员的地址。又因为结构体起始地址为 0 时,结构体成员的地址就是偏移量,所以最后 offsetof 便返回结构体中某个成员相对于结构体起始地址的偏移量。

相关推荐

相关文章