利用结构体成员偏移量和结构体成员地址求结构体的地址
1. 前言
在实际项目开发中,发现了两个有意思的宏定义。
#define offsetof(type, member) ((unsigned long)(&((type *)0)->member))
#define LIST_ENTRY(optr, type, member) ((type *)((char *)(optr) - offsetof(type, member)))
第一个是求结构体成员的偏移量。假设在地址0处有一个type类型的结构体,由于结构体的基地址是0,所以member的地址就是其偏移量。你也可以在地址0x1处假设,那么其定义为:#define offsetof(type, member) ((unsigned long)(&((type *)0x1)->member) – 0x1),看起来还是在0处比较简洁。
第二个宏定义是假如你知道某个结构体成员的地址,那么通过其偏移量可以求出结构体的地址。其中optr是结构体成员的地址,type是结构体类型,member是结构体成员。其实很好理解,成员的地址减去成员的偏移量即为结构体的首地址。
下面通过一个例子进一步理解。
2. 代码
#include<stdio.h>
#in