contain_of宏定义

 Container_of在Linux内核中是一个常用的宏,用于从包含在某个结构中的指针获得结构本身的指针,通俗地讲就是通过结构体变量中某个成员的首地址进而获得整个结构体变量的首地址。

实现方式:

  container_of(ptr, type, member) ;

   其实它的语法很简单,只是一些指针的灵活应用,它分两步:

    第一步,首先定义一个临时的数据类型(通过typeof( ((type *)0)->member )获得)与ptr相同的指针变量__mptr,然后用它来保存ptr的值。

    第二步,用(char *)__mptr减去member在结构体中的偏移量,得到的值就是整个结构体变量的首地址(整个宏的返回值就是这个首地址)。

    其中的语法难点就是如何得出成员相对结构体的偏移量?

通过例子说明,如清单1:

 1 #include <stdio.h>
 2 #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
 3 #define  container_of(ptr, type, member) ({                      \
 4                       const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
 5                        (type *)( (char *)__mptr - offsetof(type,member) );})
 6 struct test_struct {
 7            int num;
 8           char ch;
 9           float f1;
10   };
11  int main(void)
12   {
13           struct test_struct *test_struct;
14           struct test_struct init_struct ={12,'a',12.3};
15           char *ptr_ch = &init_struct.ch;
16           test_struct = container_of(ptr_ch,struct test_struct,ch);
17           printf("test_struct->num =%d\n",test_struct->num);
18           printf("test_struct->ch =%c\n",test_struct->ch);
19           printf("test_struct->ch =%f\n",test_struct->f1);
20           return 0;
21   }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏木子昭的博客

简单点! python匿名函数!

适用场景 懒得为函数起名 函数只用一次 好处 写起来方便 避免对函数命名空间的污染 用法 按照字典特定键排序 ? 对字典年龄进行排序 格式 lambda 参数 ...

27710
来自专栏别先生

python的学习和使用

1090
来自专栏Java编程技术

并发队列-无界非阻塞队列ConcurrentLinkedQueue原理探究

常用的并发队列有阻塞队列和非阻塞队列,前者使用锁实现,后者则使用CAS非阻塞算法实现,使用非阻塞队列一般性能比较好,下面就看看常用的非阻塞ConcurrentL...

1001
来自专栏Zephery

2017-03-01学习笔记

知识点 1.java中只有值传递,没有引用传递http://guhanjie.iteye.com/blog/1683637 2.final关键字 final修饰...

3558
来自专栏黑泽君的专栏

c语言中的堆、栈和内存映射

Static Area(静态区):存放全局变量/常量、静态变量/常量。 该区域的大小在程序一加载进内存的时候就已固定,但是静态变量的值是可以改的。

911
来自专栏python3

Python语句-if.....else......

似乎所有的条件语句都使用if.....else.....,它的作用可以简单地概括为非此即彼,满足条件A则执行A的语句,否则执行B语句,python的if.......

872
来自专栏数据结构与算法

3185 队列练习 1

3185 队列练习 1 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 给定一...

2866
来自专栏Java大联盟

Java面试手册:核心基础-3

2.数组有没有length()这个方法? String有没有length()这个方法?

1293
来自专栏铭毅天下

深究|Elasticsearch单字段支持的最大字符数?

在业务系统中,遇到过两个问题: 问题1:设置为keyword类型的字段,插入很长的大段内容后,报字符超出异常,无法插入。 问题2:检索超过ignore_abov...

53711
来自专栏yl 成长笔记

深刻理解反射(Reflection)

最近公司在搞自动化测试,由于版权问题,无法用 ’录制脚本‘ 进行,也就没法用 VS 自带的 UITest 框架(蛋疼), 所以只能开源的 FlaUI 框架来搞了...

1084

扫码关注云+社区