• 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");
    }
  • 相关阅读:
    这就是搜索引擎--读书笔记六--索引的查询
    这就是搜索引擎--读书笔记五--索引的建立与更新
    JavaWeb学习总结第四篇--Servlet开发
    算法帝国--读书笔记
    这就是搜索引擎--读书笔记四--索引基础
    这就是搜索引擎--读书笔记三
    Python学习总结之五 -- 入门函数式编程
    ASP.NET-FineUI开发实践-4(二)
    ASP.NET-FineUI开发实践-4
    ASP.NET-FineUI开发实践-3
  • 原文地址:https://www.cnblogs.com/zhanggaofeng/p/5567664.html
Copyright © 2020-2023  润新知