宏定义函数container_of的解释

从kernel里面抠出的一些与宏container_of有关的代码,如下:





1、此宏作用是从结构体的某元素(member)出发,得到结构体的首地址;


2、container_of的参数解释

(1)type:指的是(包含member这个成员元素的结构体)所对应的类型,即(我们要获取首地址的那个结构体)所对应的类型;

(2)member:指的是结构体中的某个元素的名字,我们就是从这个元素出发,得到结构体的首地址。注意这个元素在内核中可能也是结构体。

(3)ptr:指向结构体中member这个元素的指针。


3、offsetof的解释

(1)格式这样看比较明显(->优先级比&高):#define offsetof(TYPE, MEMBER)   (    (size_t)      &( (TYPE *)0 )->MEMBER     )

  • 首先(TYPE *)0 ,然后(TYPE *)0 ->MEMBER,接着&((TYPE *)0 ->MEMBER),最后强制类型转换为size_t类型。

(2)进一步解释


  • 即先将0地址强制转换为(要获取首地址的那个)结构体的指针;
  • 然后获取元素member,进而取其地址。由于结构体的指针指向地址为0,那么元素member的地址就是member元素偏移结构体首地址的偏移量。
  • 由于此时偏移量是以地址形式(就一个数字,或者说指针)呈现的,我们要把它改成int类型,所以来一个强制类型转换。

4、container_of解释

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

首先获取结构体元素member的的类型,然后定义一个指向此类型的指针_mptr,并赋值为ptr;

(2)(type *)  (  (char *)__mptr   -  offsetof(type, member)   )

首先将_mptr强制转化为char*类型,然后减去偏移量,最后强制转换为结构体类型指针,即返回了结构体首地址。

这里之所以转换为char*类型,是因为减去偏移量时,偏移量是多少,那就减去多少字节。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/461590.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【ASP.NET Web API教程】2.3 与实体框架一起使用Web API

2.3 Using Web API with Entity Framework 2.3 与实体框架一起使用Web API 本小节是ASP.NET Web API第2章的第3小节,原文共分为7个部分,分成了7篇文章,故这里也分为7个帖子贴出,以下是本小节的第1部分 — 译者注。 Part 1: Overvi…

ITTC数据挖掘平台介绍(综述)——平台简介

数据挖掘方兴未艾,大量新事物层出不穷。本系列将介绍我们自主设计的数据挖掘软件平台。与大家共同分享对知识,微博,人际等复杂网络的分析,以及对自然语言处理的见解。 一、我们需要怎样的数据挖掘系统 一直以来,以高校…

Linux—程序包安装与管理

1、软件包是对于一种软件所进行打包的方式。在不同的操作系统中,软件包的类型有很大的区别。对于Linux系统中,软件包主要以两种形式出现:二进制包以及源代码包。二进制包:1)传统的red hat linux二进制包2)d…

Master-Detail(主表明细),确认可以出货的SQL指令 -- Not Exists

这是我文章的备份,原文请看: http://www.dotblogs.com.tw/mis2000lab/archive/2011/08/18/master_detail_finish_and_shipping.aspx [补充]下集,第十四章。Master-Detail(主表明细),确认可以出货的SQL指令…

开发板——X210开发板的SD卡启动方式

以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。 前言与总结 这里说的SD卡启动方式,指的是uboot在SD卡中或者在inand里,且启动介质拨码开关选择SD卡启动方式(对于X210,是拨到远离电源键的一侧&#xf…

使用iBATIS3.0完成增删改查

为什么80%的码农都做不了架构师?>>> 使用iBATIS3.0完成增删改查 iBATIS3.0和以前的版本有一些改变,不过学过以前版本的再学习3.0应该不是太难,3.0要求JDK1.5支持,因为其中增加了注解和泛型,这些都是JDK1.5…

oracle-11g-R2监听文件配置

客户端连接oracle数据库时出现如下错误: Listener refused the connection with the following error: ORA-12514, TNS:listener does not currently know of service requested in connect descriptor 首先看看Oracle服务是否开启: 然后找到listener.or…

【C】strcpy()需谨慎使用;

大家都知道C中的strcpy()函数是用来复制字符串的库函数。先附上代码看看strcpy()函数的功能&#xff1a; 1 #include<stdio.h>2 #include<string.h>3 #define MAX 204 5 int main(void)6 {7 char a[MAX]"abc";8 char b[MAX]"abcdefghi"…

多重指针操作

之前对多重指针操作心存忐忑&#xff0c;不能很熟练使用&#xff0c;本质原因是不了解其实质&#xff0c;因此对其进行了学习。 一、简单的代码如下 #include <stdio.h> #include <stdlib.h> #include <string.h>void myArray(char ***p2, int num) {int i0;…

嵌入式Linux系统的构成和启动总结

以下内容源于网络资源的整理&#xff0c;如有侵权请告知删除。 一、嵌入式Linux系统典型结构 Flash划分成以下4个区&#xff1a; &#xff08;1&#xff09;Bootloader区。存放的是Bootloader&#xff0c;它负责嵌入式系统最初的硬件初始化、驱动和内核加载。 &#xff08;2&…

根文件系统的简介

以下内容源于网络资源的整理&#xff0c;如有侵权请告知删除。 一、文件系统 文件系统是对一个存储设备上的数据进行组织的机制。这种机制有利于用户和操作系统的交互。 尽管内核是 Linux 的核心&#xff0c;但文件却是用户与操作系统交互所采用的主要工具。对Linux来说尤其如…

函数指针的使用

在学习群里看到的一个程序&#xff0c;基本说明了函数指针的用法。就摘录如下&#xff1a;

CreateThread和_beginthread的区别

1.程序&#xff1a;程序构成&#xff1a;(1)源代码(2)可执行的二进制代码程序是指令和数据的有序集合&#xff0c;其本身没有任何运行的含义&#xff0c;是一个静态的概念。由操作系统加载其可执行的二进制代码&#xff0c;分配相应的数据结构&#xff1a;进程控制块PCB(Proces…

冒泡排序 Bubble Sort

冒泡排序 冒泡排序的过程很简单&#xff0c;就是不断比较相邻两个元素的大小关系&#xff0c;若逆序则交换之&#xff0c;这样通过一轮的比较&#xff0c;关键字最大的记录就沉底了。 一般地说&#xff0c;第i趟冒泡排序是从第一个元素起到第n-i1个元素依次比较相邻两个记录的关…

从源码到可执行程序的步骤

以下内容源于朱有鹏《物联网大讲堂》课程的学习整理&#xff0c;以及网页http://mp.weixin.qq.com/s/_iVrUtA-jgE8XAR-vKYcww的学习整理。如有侵权&#xff0c;请告知删除。 一、总结 从源码到可执行程序的步骤&#xff1a;预编译、编译、汇编、链接。前三个宏观上为编译&…

win设置壁纸

默认壁纸图片位置&#xff1a; C:\Windows\Web\Wallpaper\Scenes 你可以自己建文件夹&#xff0c;放自己喜欢的桌面壁纸。 设置壁纸&#xff1a; 桌面右键 -> 个性化 然后点击 “桌面背景” -> 可以点击标题选择其下面的所有图片&#xff0c;也可以按 ctrl 选择你想要的…

物理机安装ESXI6.7提示No Network Adapters的解决方案

下载好ESXI6.7.iso镜像&#xff0c;写入U盘后&#xff0c;提示No Network Adapters&#xff0c;找不到网卡驱动。 解决办法&#xff1a;需要重新封装ESXI&#xff0c;将对应的网卡驱动嵌入进来。 1、先下载VMware-PowerCLI-6.5.0和ESXi-Customizer-PS&#xff1a; http://down.…

mysqlslap详解--MySQL自带的性能压力测试工具(转)

本文的参考博客地址为&#xff1a;https://blog.csdn.net/fuzhongfaya/article/details/80943991 和 https://www.cnblogs.com/davygeek/p/5253830.html 本文的目的一方面是自己整理&#xff0c;防止后续忘记&#xff0c;一方面是对参考博客的进行验证. 首先在这里介绍一下常用…

Android Gallery控件使用方法详解

我们今天给大家讲的就是Gallery控件&#xff0c;这个控件在android当中是非常重要的&#xff0c;我们今天就给大家介绍一下3D的Gallery控件是怎么样来实现的。下面我们就来直接看看代码吧。 1.扩展Gallery&#xff1a; public class GalleryFlow extends Gallery { private Cam…

javax.servlet.jsp.JspTagException:

2019独角兽企业重金招聘Python工程师标准>>> Illegal use of <when>-style tag without <choose> as its direct parent 这个错误一般是在jsp页面中非法使用<when>标签 该标签必须是<choose>标签的直接子标签 不能单独是<when>标签 …