相城区公司网站建设,南京制作网页培训班,网站建设关键字,网页升级访问通知天天更新我们在以前学过这个offsetof函数#xff0c;知道它的功能是求指针相较于起始位置的偏移量#xff0c;我们今天要来写出一个宏#xff0c;计算结构体中某成员变量相对于起始位置的偏移。 目录
1.offsetof函数
1.1offsetof函数介绍
1.2offsetof函数代码实现
2.offsetof函数…我们在以前学过这个offsetof函数知道它的功能是求指针相较于起始位置的偏移量我们今天要来写出一个宏计算结构体中某成员变量相对于起始位置的偏移。 目录
1.offsetof函数
1.1offsetof函数介绍
1.2offsetof函数代码实现
2.offsetof函数的模拟实现
2.1实现思路
2.2offsetof模拟实现 1.offsetof函数
1.1offsetof函数介绍 我们先复习一下这个函数方便我们模拟实现它 1.函数功能求指针相较于起始位置的偏移量 2.头文件#includestddef.h 3.使用格式size_t offsetof( structName, memberName ); 4.返回值指定成员相较于起始位置的偏移量对于位字段它是未定义的 1.2offsetof函数代码实现 我们就写一个简单的函数来体会它的用法 #define _CRT_SECURE_NO_WARNINGS 1
#includestdio.h#includestddef.htypedef struct S
{char c1;int i;char c2;
}S;int main()
{printf(%d\n, offsetof(S,c1));printf(%d\n, offsetof(S, i));printf(%d\n, offsetof(S, c2));return 0;
} 那么offsetof到底是如何算出这几个偏移量的呢就是我们模拟实现这个函数的关键。 2.offsetof函数的模拟实现
2.1实现思路 我们要计算结构体中某成员变量相对于起始位置的偏移那我们首先分析一个结构体 我们用地址相减来实现offsetof函数的模拟实现 2.2offsetof模拟实现 #define OFFSETOF(type,member) (size_t)(((type*)0)-member)
//(type*)0默认0地址处存放一个结构体S类型的数据
//size_t把地址强转为整数
typedef struct S
{char c1;int i;char c2;
}S;
int main()
{printf(%d\n, OFFSETOF(S, c1));printf(%d\n, OFFSETOF(S, i));printf(%d\n, OFFSETOF(S, c2));return 0;
} 这就是我们offsetof函数的模拟实现的方法希望大家可以理解当然还有别的方法大家可以开动脑筋想一想。我们这里默认在结构体0地址处存放第一个结构体成员那么当不是0地址处开辟的这个结构体空间就需要用到地址相减这种情况我们自定义的宏又该如何实现我们可以思考一下这个问题。
ok我们下期再见