今天看看几个月前老师让写的通用链表,突然的想起了一个问题,就是关于结构体的偏移
#include<stdio.h>
#include<stdlib.h>
#define offset(TYPE,MEMBER) ( (long)&((TYPE *)0)->MEMBER )
typedef struct list
{
int a;
char b;
long int c;
}list,*plist;
int main()
{
printf("%ld",offset(list,a));
printf("%ld",offset(list,b));
printf("%ld",offset(list,c));
return 0;
}
上面关于偏移量的计算方法: (long)&((TYPE *)0)- MEMBER
首先将0强制转换成 结构体指针类型,为什么从0开始呢? 这就是为了避免计算偏移量的过程中减去起始位置的原因。