免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 871 | 回复: 0
打印 上一主题 下一主题

linux 0.11 - 结构成员位置偏移量计算的一些不解 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-10-12 01:34 |只看该作者 |倒序浏览

                                //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: #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)  == 0offsetof(struct aa,b)  == 8offsetof(struct aa,c)  == 9
可MinGW Developer Studio下测试时,
offsetof(struct aa,a)  == 0offsetof(struct aa,b)  == 8offsetof(struct aa,c)  == 12   /* 不解!! */
附测试程序:
/* 2008.10.12 */
#includestddef.h>
#includestdio.h>
int main()
{
    struct aa
    {
        long long a;
        char b;
        int c;
    }t;
   
    unsigned long a1;
    a1 = offsetof(struct aa,a);
    //a1 = ((unsigned long) & ((struct aa *)0) -> a);
    printf("aa-a:%ld\n",a1);
    a1 = ((unsigned long) & ((struct aa *)0) -> b);
    printf("aa-b:%ld\n",a1);
    a1 = ((unsigned long) & ((struct aa *)0) -> c);
    printf("aa-c:%ld\n",a1);
   
    printf("sizeof(char) -- %d\n",sizeof(char));
    printf("sizeof(int) -- %d\n",sizeof(int));
    printf("sizeof(long) -- %d\n",sizeof(long));
    printf("sizeof(long long) -- %d\n",sizeof(long long));
   
    return 0;
}
               
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/33029/showart_1286738.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP