⭐️ 往期文章
✨链接1:C语言文件打开关闭详解、文件顺序读写详解。
✨链接2:C语言文件随机读写详解(fseek、ftell、rewind)。
✨链接3:C语言scanf/fscanf/sscnaf和printf/fprintf/sprintf的区别。
✨链接4:C语言打开文件一次既可以读又可以写。
✨链接5:C语言文件结束的判定(feof、ferror)。
✨链接6:宏和函数的区别详解。
✨链接7:C语言结构体计算大小结构体的对齐数,修改默认对齐数。
⭐️ offsetof
💬 宏原型:
size_t offsetof( structName, memberName );
structName
结构体类型memberName
结构体成员名字size_t offsetof
返回一个size_t
数,size_t
是无符号数
💬 宏作用: 计算结构体成员相对于结构体类型的偏移量。
💬 宏头文件:#include <stddef.h>
⭕️ 宏的使用
#include <stddef.h>
#include <stdio.h>
struct S {
int a;
char c;
double d;
};
int main() {
printf("%d\n" , offsetof(struct S , a));
printf("%d\n" , offsetof(struct S, c));
printf("%d\n" , offsetof(struct S, d));
return 0;
}
⭕️ 宏的模拟实现
#define OFFSETOF(struct_type , name) ((size_t)&(((struct_type*)0)->name))
解析:
第一步把 0
转换为当前结构体类型的地址,在使用 ->
取到这个结构体的的成员。因为 0
已经是当前结构体类型的起始地址,所以结构体成员相对于结构体的偏移量就是当前成员的地址。在 &
之后强制类型转换为 size_t
类型。
✨学习结构体计算大小:C语言结构体计算大小结构体的对齐数,修改默认对齐数。