今天在研究计算C语言中,结构体成员的偏移量问题。发现一个宏定义就可以计算得到,在这里记录一下。
#define offsetof(type, field) (long)&(((type*)0)->field)
其含义是:在不生成结构体实例的情况下计算结构体成员的偏移量。
结构体变量的某成员的地址等于该结构体变量的基址加上结构体成员变量在结构体中的偏移量
(type*)0,就是假设地址0处存放的是一个type类型的结构体变量,这样的话这个结构体变量的基址就是0,所以结构体成员变量的地址的大小在数值上就等于该结构体成员在结构体中的偏移量。
把0换成任何一个数都是可以的,例如OxFF,如下变换:
#define offsetof(type, field) (long)&((((type*)OxFF)->field)-OxFF)
可见还是0方便一些。
应用例子:
#define offsetof(type, field) (long)&(((type*)0)->field)
typedef struct
{
unsigned long dwFreq;
unsigned char afclocked:1;
unsigned char ucSndsys;
}ProgInfo;
void main()
{
printf("%d\n", offsetof(ProgInfo, ucSndsys));//打印ucSndsys在ProgInfo中的偏移量。
}