linux 0.11 - 结构成员位置偏移量计算的一些不解

//code from linux 0.11
linux/include/stddef.h里有个宏定义:

  1. #define offsetof(TYPE,MEMBER) ((size_t)&)(TYPE *)0) -> MEMBER)

它 的作用是计算某一成员在结构类型中的偏移位置。使用这个宏可以确定一个成员(字段)在包含它的结构类型中从类型开始处算起的字节偏移量。宏的结果是 size_t的整数常数表达式。((CTYPE *)0)是将一个整数0类型投射(typecast)成数据对象指针类型,然后在该结果上进行运算。

ps:
  1. typedef unsigned long size_t;
对于结构体:

  1.  struct aa
  2.     {
  3.         long long a;
  4.         char b;
  5.         int c;
  6.     }t;

理论上计算得:

offsetof(struct aa,a)  == 0
offsetof(struct aa,b)  == 8
offsetof(struct aa,c)  == 9

可MinGW Developer Studio下测试时,

offsetof(struct aa,a)  == 0
offsetof(struct aa,b)  == 8
offsetof(struct aa,c)  == 12   /* 不解!! */


附测试程序:
  1. /* 2008.10.12 */
  2. #include<stddef.h>
  3. #include<stdio.h>

  4. int main()
  5. {
  6.     struct aa
  7.     {
  8.         long long a;
  9.         char b;
  10.         int c;
  11.     }t;
  12.     
  13.     unsigned long a1;
  14.     a1 = offsetof(struct aa,a);
  15.     //a1 = ((unsigned long) & ((struct aa *)0) -> a);
  16.     printf("aa-a:%ld/n",a1);
  17.     a1 = ((unsigned long) & ((struct aa *)0) -> b);
  18.     printf("aa-b:%ld/n",a1);
  19.     a1 = ((unsigned long) & ((struct aa *)0) -> c);
  20.     printf("aa-c:%ld/n",a1);
  21.     
  22.     printf("sizeof(char) -- %d/n",sizeof(char));
  23.     printf("sizeof(int) -- %d/n",sizeof(int));
  24.     printf("sizeof(long) -- %d/n",sizeof(long));
  25.     printf("sizeof(long long) -- %d/n",sizeof(long long));
  26.     
  27.     return 0;
  28. }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值