C/C++获取struct结构体成员的偏移值

本文介绍了如何通过结构体成员地址计算、0地址法和offsetof函数获取结构体成员的偏移值,展示了在不同场景下的使用技巧,适合理解C/C++内存布局与调试技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、有结构体对象

可以使用结构体成员的地址减去结构体对象的地址。

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yelvens

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值