原地址:理解获取结构体内偏移值 (size_t)&(((s *)0)->m) 原理_me败家懒妞的博客-CSDN博客
#define offsetof(s,m) (size_t)&(((s *)0)->m)
((s *)0):强制转化成数据结构指针,并使其指向地址0;
((s *)0)->m:使该指针指向成员m
&(((s *)0)->m):获取该成员m的地址,
因为对象指针指向地址0,成员m的地址是从0开始偏移的,所以m的地址也就是m在结构体重的偏移量。
因为是在编译期计算这个(常量)地址,实际运行中也就不会发生NULL指针访问对象崩溃的问题。