zoukankan      html  css  js  c++  java
  • linux内核中宏container_of是干什么的?

    Linux Kernel Version 4.14

    1. container_of是干什么的?

      已知一个结构体中某个成员的首指针,那么就可以通过宏container_of来获得此结构体的首指针

    2 先看看container_of是如何定义的吧

    #define container_of(ptr, type, member) 
        (type *)((char *)(ptr) - (char *) &((type *)0)->member)

      解析一下各参数:

      ptr: 结构体成员的指针

      type: 结构体的类型

      member: 结构体成员的名字

    2. 举一个例子

      2.1 有两个结构体如下:

        struct element1 {

          struct element2 struct_element2;

          int element3;

        }

        struct element2 {

          int element4;

        }

      2.2 定义一个struct element1变量element

        struct element1 element

      2.3 已知结构体变量element中成员element3的地址为0x2d,通过结构体struct element1中的成员element3来获取结构体变量element的地址

        container_of(element3_ptr,struct element1,element3)

      2.4 拆开

        (struct element1 *)((char *)(&element3) - (char *) &((struct element1 *)0)->element3)

        从已知可得:

        &element3=0x2d;

        (char *)(&element3)=0x2d;

        (struct element1 *)0=地址为0x0,指向的内容为一个struct element1结构体;

        ((struct element1 *)0)->element3=结构体中element3的内容;

        &((struct element1 *)0)->element3=取结构体中element3的地址,这是偏移地址,为0x04;

        (char *)&((struct element1 *)0)->element3=0x04;

        最终:

        ((char *)(&element3) - (char *) &((struct element1 *)0)->element3)=0x2d - 0x04) = 0x29

        (struct element1 *)0x29 = 0x29,0x29这个地址指向的是一个结构体struct element1,那么这就是element变量的地址

        

        可以结合下图观看:

      

        

        

  • 相关阅读:
    OC ----关于时间的处理
    OC-- 判断字符串是否是纯数字
    OC 判断字符串是否只存在只有空格
    将Json字符串转换为数组
    调用接口时对参数的排序、生成签名、生成随机数,获取唯一标示符
    关于UIAlertView弹出警告框自动消失
    AVAudioPlayer 获取语音的长度(时间)
    AFN 请求 https get
    TableView  — reloadData     刷新
    mapView 地图视图
  • 原文地址:https://www.cnblogs.com/dakewei/p/10537095.html
Copyright © 2011-2022 走看看