08 July 2017
struct node {
    int a;
    int b;
};

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

int main(void) {
    struct node t;
    printf("%d\n", offsetof(struct node, b)); /* 4 */

    return 0;
}
(size_t)&(((struct node *)0)->b)

先把 0 转化为 struct node * 类型,之后再访问 b 这个成员。如果不加 & 符号,那么表示的是我们想要的是 b 这个成员的值

(gdb) print ((struct node *)0)->b
  Cannot access memory at address 0x4
(gdb) print &((struct node *)0)->b
  (int *) 0x4