#include <stdio.h>
#include <stddef.h>
#define OFFSETOF(type, member) ( (size_t) & ( (type *)0 )->member)
struct D
{
char a;
int b;
char c;
int d;
};
int main()
{
printf("%zu\n", offsetof(struct D, a));
printf("%zu\n", offsetof(struct D, b));
printf("%zu\n", offsetof(struct D, c));
printf("%zu\n", offsetof(struct D, d));
printf("%zu\n", OFFSETOF(struct D, a));
printf("%zu\n", OFFSETOF(struct D, b));
printf("%zu\n", OFFSETOF(struct D, c));
printf("%zu\n", OFFSETOF(struct D, d));
printf("%zu\n", sizeof(struct D));
return 0;
}
?
?
1. `(type *)0`:将整数0强制转换为指向类型`type`的指针。这是一个类型转换,它告诉编译器把0解释为一个指向`type`类型的指针。这里的0是一个特殊的情况,它表示空指针,因为在C语言中,空指针的值通常是0。
2. `((type *)0)->member`:现在我们有了一个指向`type`类型的指针,我们可以使用`->`操作符来访问结构体的成员。这里我们访问了结构体指针指向的成员`member`。
3. `&((type *)0)->member`:最后,我们使用`&`操作符来获取成员的地址。这里的`&`操作符告诉编译器获取`((type *)0)->member`的地址,也就是`member`在结构体中的偏移量。
即`&((type *)0)->member`的结果是`member`在`type`类型的结构体中的偏移量。