本期介绍
主要介绍:什么是offsetof(),offsetof()的用法,如何自己实现这个宏。
offsetof
其实是一个宏,作用是:能够求出指定成员相对于结构体起始地址的偏移量(单位:字节byte)。大部分C语言初学者在看见offsetof
都会下意识的认为它是一个函数,这也不怪它们,因为宏命名约定的是全大写。
定义类型:
size_t offsetof(type, m_name)
其中,参数type
可以是结构体类型,也可以是结构体名;参数m_name
是需要求偏移量的结构体成员名。宏offsetof()的返回类型为size_t
,即unsigned int
类型。在使用offsetof()前需要先引用头文件
。下面是案例:
#include
struct S
{
char a;
int b;
float c;
};
int main()
{
printf("%d\n", offsetof(struct S, a));
printf("%d\n", offsetof(struct S, b));
printf("%d\n", offsetof(struct S, c));
return 0;
}
相信有些同学会不理解这里的结果,或者甚至都没有听说过结构体还有什么偏移量的,这就要说到结构体内存对齐了。我曾今讲述过,这是链接:结构体内存对齐。
上面我们了解了什么是offsetof(),以及它的用法,下面我们就来尝试一下自己实现这个宏。首先,我们知道宏有两个参数(结构体名,成员名),那怎么通过这两个参数求偏移量呢?很简单,由于&结构体名
求的就是结构体起始位置的地址,故我们只要用成员变量的地址减去起始位置的地址,就可以算出成员的偏移量了。如下图所示:
#define OFFSETOF(type, name_m) (size_t)&(((type*)0)->name_m)
//将0地址设置为结构体的起始地址,然后取成员变量的地址,就是该成员的偏移量
struct S
{
char a;
int b;
float c;
};
int main()
{
printf("%d\n", OFFSETOF(struct S, a));
printf("%d\n", OFFSETOF(struct S, b));
printf("%d\n", OFFSETOF(struct S, c));
return 0;
}
这份博客如果对你有帮助,给博主一个免费的点赞以示鼓励欢迎各位点赞评论收藏⭐️,谢谢!!!
如果有什么疑问或不同的见解,欢迎评论区留言欧。