(一)结构体strcut test
struct test
{
char a; //1+3
int b; //4
char c; //1+3
};
通过结构体的内存对齐 1的原则可以得到该结构体的大小是12
结构体元素的相对0的地址的偏移量分别如下:
- a 0
- b 4
- c 8
(二)宏函数详解
#define OFFSET_STRUCT(structname, element) (int)&(((structname *)0)->element)
- OFFSET_STRUCT(structname, element)是一个宏函数,有两个参数,第一个参数structname是结构体类型名,第二个参数是结构体的元素。
- (int)&(((structname *)0)->element)
(1)给定一个structname* 类型的0地址(强制类型转换)
(2)用该地址访问成员元素((structname )0)->element
(3)再给该成员元素取地址(强制转成int*的地址)
(4)最后结果就是成员元素相对于0地址的相对偏移量
(三)完整代码测试
struct test
{
char a;
int b;
char c;
};
#define OFFSET_STRUCT(structname, element) (int)&(((structname *)0)->element)
int main()
{
printf("%d\n", OFFSET_STRUCT(struct test, a));
printf("%d\n", OFFSET_STRUCT(struct test, b));
printf("%d\n", OFFSET_STRUCT(struct test, c));
return 0;
}