一、有结构体对象
可以使用结构体成员的地址减去结构体对象的地址。
typedef struct my_struct{
char a; // 0
int b; // 4
} my_struct;
int main(void){
my_struct ms;
printf("%d\n", (size_t)((char*)&ms.b - (char*)&ms));
return 0;
}
二、没有结构体对象
2.1 使用 0 地址
将0强制转换为结构体类型的指针,获取每个成员的地址值,该地址值就是成员的偏移值。结构体成员的地址 = 结构体对象的地址 + 成员的偏移值,编译器会将(struct my_struct*)0当作是一个结构体对象的地址,所以很容易推出成员b的偏移值。这种方式在GDB调试core文件时,获取某个结构体成员的偏移值会很方便。
typedef struct my_struct{
char a; // 0
int b; // 4
} my_struct;
int main(void){
printf("%d\n", (size_t)&((struct my_struct*)0)->b);
return 0;
}
2.2 使用offsetof函数
标准库<stddef.h>中定义了函数offsetof(type,member),该函数是一个宏定义,第一个参数是结构体的类型,第二个参数是所求的成员名。
#include <stddef.h>
typedef struct my_struct{
char a; // 0
int b; // 4
} my_struct;
int main(void){
printf("%d\n", offsetof(struct my_struct, b));
return 0;
}
本文介绍了如何通过结构体成员地址计算、0地址法和offsetof函数获取结构体成员的偏移值,展示了在不同场景下的使用技巧,适合理解C/C++内存布局与调试技巧。
3278

被折叠的 条评论
为什么被折叠?



