物联网
您现在所在的位置:首页>企业动态>物联网

container_of作用及用法讲解

编辑:学到牛牛IT培训    发布日期: 2023-03-16 09:24:04  

在C语言中,有时候我们需要从成员变量的指针来获得对象所在的地址,这时候可以使用container_of宏实现。这个宏定义在Linux内核中,并且已经被广泛地应用于其他开源项目中。


1678928005017(1).jpg


container_of宏定义如下:


#define container_of(ptr, type, member) ({

    const typeof(((type *)0)->member) *__mptr = (ptr);

    (type *)((char *)__mptr - offsetof(type, member)); })

其中,ptr表示成员变量的指针,type表示包含该成员变量的结构体类型,而member则是该成员变量的名称。


container_of宏的实现原理是利用offsetof宏计算出成员变量在结构体中的偏移量,然后通过指针运算得到结构体的首地址。


下面是一个简单的示例程序,演示了如何使用container_of宏:


c

#include <stdio.h>

#include <stddef.h> // for offsetof macro


struct person {

    char name[20];

    int age;

};


struct node {

    struct person data;

    struct node *next;

};


int main() {

    struct person *p;

    struct node n = {{"John", 25}, NULL};

    struct node *pn = &n;

    

    p = &pn->data; // get the address of the person struct

    

    struct node *container = container_of(p, struct node, data);

    

    printf("Person's name: %s ", container->data.name);

    printf("Person's age: %d ", container->data.age);

    

    return 0;

}

在这个示例程序中,我们定义了两个结构体:person和node。其中,person结构体表示一个人的基本信息,而node结构体包含一个person结构体和下一个节点的指针。


在main函数中,我们首先获取了person结构体的地址,然后通过container_of宏获得了node结构体的地址。最后,我们就可以方便地访问node结构体中的成员变量了。


总之,container_of宏是一种非常方便的方法,可以让我们从成员变量的指针中获得包含该成员变量的结构体的地址。这个宏已经被广泛地应用于各种开源项目中,并且是一种C语言编程中非常重要的技巧。


免费试学
课程好不好,不如实地听一听

推荐阅读

  • Qt开发者的AI进化论:当传统GUI框架遇见智能时代

    国产午夜鲁丝片AV无码蜜臀,福利免费观看午夜体检区,人妻少妇精品无码专区APP,伊人久久大香线蕉成人综合网,国产妓女在线观看视频,亚洲成a人片在线观看尤物,亚洲精品国产一二三无码AV,亚汌国产一区二区三区

  • QT能被应用在人工智能领域有哪些应用

    国产午夜鲁丝片AV无码蜜臀,福利免费观看午夜体检区,人妻少妇精品无码专区APP,伊人久久大香线蕉成人综合网,国产妓女在线观看视频,亚洲成a人片在线观看尤物,亚洲精品国产一二三无码AV,亚汌国产一区二区三区

  • 什么学校学计算机编程比较好

    国产午夜鲁丝片AV无码蜜臀,福利免费观看午夜体检区,人妻少妇精品无码专区APP,伊人久久大香线蕉成人综合网,国产妓女在线观看视频,亚洲成a人片在线观看尤物,亚洲精品国产一二三无码AV,亚汌国产一区二区三区

  • 计算机专业的就业难度怎么样?

    国产午夜鲁丝片AV无码蜜臀,福利免费观看午夜体检区,人妻少妇精品无码专区APP,伊人久久大香线蕉成人综合网,国产妓女在线观看视频,亚洲成a人片在线观看尤物,亚洲精品国产一二三无码AV,亚汌国产一区二区三区

封闭学习

2

1

18180749853

蜀ICP备2021001672号

在线咨询 免费试听VIP课程