关于#define offsetof(s,m) (size_t)&(((s *)0)->m)

#define offsetof(s,m) (size_t)&(((s *)0)->m)
s是一个结构体,m是s的成员变量
这个宏的作用是取到s中的m相对于s的偏移量
(s *)0 将0强制转换为s类型的指针,并指向0地址
((s *)0)->m 使该指针指向成员变量m
&(((s *)0)->m)获取成员变量m的地址,因为首地址是0,所以m的地址值就等于m的偏移量。此处编译器不会生成访问m的代码,而是直接计算出地址值
(size_t)&(((s *)0)->m) 将地址转换为size_t类型