成员变量在结构体中的偏移——offsetof(type, member)

转自http://blog.csdn.net/gdutliuyun827/article/details/8440552


size_t offsetof(type, member):看上去像个函数其实这是一个宏;用于求取member成员在类型为type的结构体中的偏移量;(member是type中的一个成员,否则会出错)。

先看一个例子,稍后再看其中的实现。

[cpp]  view plain  copy
  1. #include <stddef.h>  
  2. #include <stdio.h>  
  3. #include <stdlib.h>  
  4.   
  5. int  
  6. main(void)  
  7. {  
  8.     struct s {  
  9.         int i;  
  10.         char c;  
  11.         double d;  
  12.         char a[];  
  13.     };  
  14.   
  15.     /* Output is compiler dependent */  
  16.   
  17.     printf("offsets: i=%ld; c=%ld; d=%ld a=%ld\n",  
  18.             (long) offsetof(struct s, i),  
  19.             (long) offsetof(struct s, c),  
  20.             (long) offsetof(struct s, d),  
  21.             (long) offsetof(struct s, a));  
  22.     printf("sizeof(struct s)=%ld\n", (longsizeof(struct s));  
  23.   
  24.     exit(0);  
  25. }  

 

编译运行输出结构:

[cpp]  view plain  copy
  1. offsets: i=0; c=4; d=8 a=16  
  2. sizeof(struct s)=16  


其实现是:

[cpp]  view plain  copy
  1. #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)  

看明白了吗?把地址0强制转化为type的类型,然后取member变量的地址,再转为size_t就是偏移量了,size_t其实就是unsigned long类型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值