offsetof的模拟实现

发布时间:2024年01月19日
#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`类型的结构体中的偏移量。

文章来源:https://blog.csdn.net/cookies_s_/article/details/135699933
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。