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
