#define offsetof(s,m) (size_t)&(((s *)0)->m)
(s *)0:将0转化为s结构体类型的指针,
((s *)0)->m:引用成员m
&(((s *)0)->m):成员m相对于结构体s首地址的偏移量
(size_t)&(((s *)0)->m):偏移量转换为size_t,size_t是unsigned int类型
例:
struct S1
{
char c;
int i;
};
c的偏移量是0,i的偏移量是4
struct S2
{
char c1;
S1 s;
char c2;
};
c1的偏移量为0,s是S1结构体类型,大小为8,偏移量为4,c1与s之间便需要3个填充字节(4字节对齐),而c2与s之间就不需要了,所以c2的偏移量为12
宏功能:结构体s中成员m相对于结构体s首地址的偏移量
说明:s:结构体类型 m:成员
(s *)0:将0转化为s结构体类型的指针,
((s *)0)->m:引用成员m
&(((s *)0)->m):成员m相对于结构体s首地址的偏移量
(size_t)&(((s *)0)->m):偏移量转换为size_t,size_t是unsigned int类型
例:
struct S1
{
char c;
int i;
};
c的偏移量是0,i的偏移量是4
struct S2
{
char c1;
S1 s;
char c2;
};
c1的偏移量为0,s是S1结构体类型,大小为8,偏移量为4,c1与s之间便需要3个填充字节(4字节对齐),而c2与s之间就不需要了,所以c2的偏移量为12