文章目录
-
- 👩🏫每日一问,好好复习
- offsetof
-
- 🔒1.1什么是offsetof?
- 🔒1.2如何声明?
- 🔒1.3实例
- 🔒1.4图示
- offsetof如何实现
-
- 🔒2.1offsetof原理
- 2.2实现offsetof
👩🏫每日一问,好好复习
❤结构体大小怎么计算?内存对齐?偏移量?
在结构体大小计算中,我们提到了内存对齐的问题,并且“人工”的计算了偏移量,那有什么方法可以“解放双手”嘛~
offsetof
🔒1.1什么是offsetof?
C 语言库中提供了一个宏函数 offsetof(type, member-designator)
它会生成一个类型为 size_t 的整型常量,是一个结构成员相对于结构开头的字节偏移量
成员是由 member-designator 给定的,结构的名称是在 type 中给定的。
![]()
【C++】求某成员相对于结构体起始位置的偏移量? 🔒1.2如何声明?
参数
offsetof(type, member-designator)
返回值这是一个 class 类型,其中,member-designator 是一个有效的成员指示器。
type
这是一个 class 类型的成员指示器。
member-designator
该宏返回类型为的值,表示 type 中成员的偏移量。
size_t
🔒1.3实例
下面的实例演示了 offsetof() 宏的用法。
#include <stddef.h>//必带头文件
#include <stdio.h>
struct address {
char name[5];
char street[10];
int phone;
};
int main()
{
printf("address 结构中的 name 偏移 = %d 字节。\n",
offsetof(struct address, name));
printf("address 结构中的 street 偏移 = %d 字节。\n",
offsetof(struct address, street));
printf("address 结构中的 phone 偏移 = %d 字节。\n",
offsetof(struct address, phone));
return(0);
}
🔒1.4图示
![]()
【C++】求某成员相对于结构体起始位置的偏移量?
offsetof如何实现
🔒2.1offsetof原理
1.上述的图解我们可以发现
偏移量 = (成员的起始存放地址-起始地址)= 成员地址
2.那我们假设结构体的起始地址是0,那成员的偏移量就是成员的地址
3.思路来了
3.1我们只需要把0强转成结构体指针类型
3.2用这个指针去访问结构体的成员
3.4取出这个成员的地址,因为现在的结构体起始位置的地址是0,所以得到的值就是这个成员的偏移量
3.5最后强转成
类型,就得到结果了
size_t
2.2实现offsetof
#include <stddef.h>//必带头文件
#include <stdio.h>
#define OFFSETOF(struct_type,mem_name) \
(size_t)(&((struct_type*)0)->mem_name)
struct address {
char name[5];
char street[10];
int phone;
};
int main()
{
printf("%u\n", OFFSETOF(struct address, name));//0
printf("%u\n", OFFSETOF(struct address, street));//5
printf("%u\n", OFFSETOF(struct address, phone));//16
offsetof(struct address, name));//0
offsetof(struct address, street));//5
offsetof(struct address, phone));//16
return(0);
}