前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >offsetof宏的模拟实现

offsetof宏的模拟实现

作者头像
怠惰的未禾
发布2023-04-27 21:25:40
2810
发布2023-04-27 21:25:40
举报
文章被收录于专栏:Linux之越战越勇Linux之越战越勇

前言

本文介绍并模拟实现宏offsetof


offsetof介绍

格式:offsetof(type, member) 头文件:<stddef.h> 这个宏有两个参数:

type是一个结构体类型或联合类型; member是结构体或联合的某一个成员

功能:返回成员相对于结构或联合起始地址的偏移量(以字节为单位),返回类型是size_t


模拟实现

结构体起始地址加上该成员相对于起始地址的偏移量就是成员变量的地址想要知道成员相对于结构体起始地址的偏移量,假设结构体起始地址位于0地址处,那么结构体成员变量的地址强制类型转换size_t相当于该成员相对于起始地址的偏移量

代码语言:javascript
复制
#define OFFSETOF(type, member) (size_t)( &( ( ( type* )0 ) -> member) )

  1. 把整数0强制类型转换为type*类型,相当于一个结构体的起始地址位于0地址处;
  2. 接着通过箭头访问操作符访问结构体成员member,相当于找到了结构体成员member
  3. 取出结构体成员member的地址并强制类型转换为size_t类型;

例子:

代码语言:javascript
复制
#include <stdio.h>
#include <stddef.h>
#define OFFSETOF(type, member) (size_t)(&(((type*)0)->member))

struct S {
	int a;//0~3
	char b;//4
	//5
	short c;//6~7
};
int main() {
	printf("%d\n", offsetof(struct S, a));
	printf("%d\n", offsetof(struct S, b));
	printf("%d\n", offsetof(struct S, c));
	
	printf("%d\n", OFFSETOF(struct S, a));
	printf("%d\n", OFFSETOF(struct S, b));
	printf("%d\n", OFFSETOF(struct S, c));

	return 0;
}

运行结果:

image.png
image.png

END

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-08-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • offsetof介绍
  • 模拟实现
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档