zoukankan      html  css  js  c++  java
  • C语言 结构体中属性的偏移量计算

    //计算结构体偏移量
    
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    //详解:对于offscfof()函数,
    //(TYPE *)0这句的意思是将内存地址是0内存块转换成一个TYPE类型的指针
    //那么此时0地址的指针的步长就是TYPE,
    //(TYPE *)0)->MEMBER这句话是取TYPE结构体的MEMBER属性(注意此时TYPE结构体的指针的值是0)
    //&((TYPE *)0)->MEMBER,&就是取地址的运算符,这句话的意思是取TYPE结构体的MEMBER属性的地址
    //(size_t)就是强转成size_t类型,因为此时结构体的指针的值是0,强转成Int型,恰巧就是MEMBER在结构体的偏移量
    #define offscfof(TYPE,MEMBER) ((size_t)&((TYPE *)0)->MEMBER)
    
    //详解:对于container_of()函数,
    //offscfof(type,member)是该属性在结构体中的偏移量
    //ptr是member属性在内存中的实际地址,为什么要将ptr强转成char *类型呢?
    //这是由于指针加减的特殊性决定的 比如 (int *)ptr-1,指针会向上移动4个字节,(char *)ptr-1 指针会向上移动1个字节
    //指针是有步长的,不能是简单的加减,偏移量就是偏移的字节数,所以强转成char *类型正好
    #define container_of(ptr,type,member) (type *)((char *)ptr-offscfof(type,member))
    
    
    typedef struct _student1{
        int num;
        char name[20];
        int pNext;
    }Student1;
    
    void main(){
        int res = 0;
        Student1 a;
        res = (int)container_of(&a.pNext,Student1, pNext);
        printf("Student1的地址%d
    ", sizeof(a));
        printf("Student1的地址%x
    ",&a);
        printf("Student1的地址%x
    ", res);
        system("pause");
    }
  • 相关阅读:
    WeX5开发指南
    移动web app开发框架
    [转]10款 Web 开发常备工具
    为兴趣求职:如何学习UI框架,请将你的看法观点写在评论下面
    10 个顶尖的 Linux 开源人工智能工具
    【转】编写Chrome扩展程序
    HDOJ 4455 Substrings 递推+树状数组
    iOS开发人员:事实上你还有非常多东西须要学
    鸡肋的JdbcRDD
    OFbiz实体引擎
  • 原文地址:https://www.cnblogs.com/zhanggaofeng/p/5567664.html
Copyright © 2011-2022 走看看