🎗 先来回忆下offsetof宏是怎么使用的
⭕ 函数信息
#include<stdio.h> #include<stddef.h> struct A { int a; short b; int c; char d; }; int main() { printf("%d\n", offsetof(struct A, a)); printf("%d\n", offsetof(struct A, b)); printf("%d\n", offsetof(struct A, c)); printf("%d\n", offsetof(struct A, d)); return 0; }
📝 题述1:模拟一个offsetof宏
💨 输入描述:无
💨 输出描述:输出结构体所有成员相对于起始位置的偏移量
🔑 核心思想:
结构体成员的地址 - 起始地址就是这个结构体成员的偏移量
(int) & (((struct A*)0x400) -> b) - 0x400
假设在结构体的起始位置有一个struct A*类型的变量0,然后拿出结构体成员的地址,再把地址强转为整型就是这些成员相对于起始位置的偏移量
#include<stdio.h> #define OFFSETOF(struct_name, member_name) (int)&(((struct_name*)0) -> member_name) struct A { double a; char b; int c; }; int main() { printf("%d\n", OFFSETOF(struct A, a)); printf("%d\n", OFFSETOF(struct A, b)); printf("%d\n", OFFSETOF(struct A, c)); return 0; }