如何知道结构体中某个成员相对于结构体起始位置的偏移量

其实是存在这样一个宏,专门提供求某个结构体中的成员相对于这个结构体的偏移量的:

offsetof (type,member)

返回值:返回成员偏移量,类型为size_t
功能:具有函数形式的此宏返回数据结构或联合类型类型中成员成员的偏移值(以字节为单位)。 返回的值是size_t类型的无符号整数值,以及指定成员与其结构开头之间的字节数。

使用方法:

/* offsetof example */
#include <stdio.h>      /* printf */
#include <stddef.h>     /* offsetof */

struct foo {
  char a;
  char b[10];
  char c;
};

int main ()
{
  printf ("offsetof(struct foo,a) is %d\n",(int)offsetof(struct foo,a));
  printf ("offsetof(struct foo,b) is %d\n",(int)offsetof(struct foo,b));
  printf ("offsetof(struct foo,c) is %d\n",(int)offsetof(struct foo,c));
  
  return 0;
}

以上是库中提供的方法,我们也可以手动实例化这个宏:

#define OFFSETOF(type, member) ((int64_t)&((type*)0)->member)//64位主机
#define OFFSETOF(type, member) ((int32_t)&((type*)0)->member)//32位主机

使用如下:

  1 #include <iostream>
  2 #include <stdint.h>
  3                                                                                                                                                                        
  4 using namespace std;
  5 
  6 #define OFFSET1(type, member) ((int64_t)&((type*)0)->member)
  7 
  8 typedef struct A{
  9     int a;
 10     char b;
 11     short c;
 12 }A;
 13 
 14 int main(){
 15 
 16     /*int a = 10;
 17     int *p = &a;
 18     cout << sizeof(p) <<endl;*/
 19 
 20     cout << OFFSET1(A, a) <<endl;
 21     cout << OFFSET1(A, b) <<endl;
 22     cout << OFFSET1(A, c) <<endl;
 23     cout << sizeof(A) <<endl;
 24     return 0;
 25 }

参考文章:http://www.cplusplus.com/reference/cstddef/offsetof/?kw=offsetof

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值