zoukankan      html  css  js  c++  java
  • offsetof使用小结

    先上例子

    #include <stdio.h>
    #include <stdlib.h>
    
    /* offsetof example */
    #include <stddef.h>     /* offsetof */
    
    struct foo {
      char a;
      char b[10];
      char c;
    };
    
    int main(void)
    {
    
        printf ("offsetof(struct foo,a) is %d
    ",(int)offsetof(struct foo,a));
        printf ("offsetof(struct foo,b) is %d
    ",(int)offsetof(struct foo,b));
        printf ("offsetof(struct foo,c) is %d
    ",(int)offsetof(struct foo,c));
        
        system("pause");
        return 0;
    }

     测试结果:

    其原型

    offsetof宏的定义如下:

    #define offsetof(type, member) (size_t)&(((type*)0)->member)

      巧妙之处在于将地址0强制转换为type类型的指针,从而定位到member在结构体中偏移位置。编译器认为0是一个有效的地址,从而认为0是type指针的起始地址。

    在不同的嵌入式系统里,不同开发商,不同架构处理器和编译器都有不同的offsetof定义形式:

    /* Keil 8051 */
    
    #define offsetof(s,m) (size_t)&(((s *)0)->m)
    
    /* Microsoft x86 */
    
    #define offsetof(s,m) (size_t)(unsigned long)&(((s *)0)->m)
    
    /* Motorola coldfire */
    
    #define offsetof(s,memb) ((size_t)((char *)&((s *)0)->memb-(char *)0))
    
    /* GNU GCC 4.0.2 */
    
    #define offsetof(TYPE, MEMBER) __builtin_offsetof (TYPE, MEMBER)
  • 相关阅读:
    20210805-接口测试实战(持续更新中···)
    2021-07-06:关于自动化测试
    学习记录-更新时间-2021-04-09
    知识点@解决端口被占用的问题
    PS学习笔记
    JS去掉数组中重复的数
    验证码倒计时
    统计数组中出现最多的字母及次数
    验证码倒计时js
    小兔鲜css
  • 原文地址:https://www.cnblogs.com/libra13179/p/9183404.html
Copyright © 2011-2022 走看看