关于container_of函数分析
#include <stdio.h>
#define offset_of(type,member) ((int)&(((type *)0)->member))
#define container_of(ptr,type,member) ({\
const typeof(((type*))->member) *__mptr = ptr;\
(type *)((char *)__mptr - offset_of(type,member));\
})
struct mytest{
char i;
int j;
char *k;
};
int main(){
struct mytest temp;
struct mytest *p;
printf("&temp = %p\n",&temp);
printf("&temp.k = %p\n",&temp.k);
printf("&((struct mytest *)0)->k = %d\n",((int)&((struct mytest *))->k));
printf("&temp = %p \n",container_of(&temp.j,struct mytest,j));
printf("&temp = %p \n",container_of(&temp.k,struct mytest,k));
return ;}
(一).分析下宏定义1:
#define offset_of(type,member) ((int)&(((type *)0)->member))
(type * )0 :强制把0地址转化为type *类型
&(((type *)0)->member) :将type类型的member成员的地址取出。这里用法很妙,由于type指针地址是0,故其成员地址都是基地址为0加上偏移地址。
(int)(&(((type *)0)->member)) :将type成员类型地址强制转化为int。
(二).分析下宏定义2:
#define container_of(ptr,type,member) ({\
const typeof(((type*)0)->member) *__mptr = ptr;\
(type *)((char *)__mptr - offset_of(type,member));\
})
2.1. 分析 const typeof(((type *)0)->member) *__mptr = ptr;
const typeof(((type *)0)->member) :typeof是关键字,获取成员类型。此部分是得到宏传过来的成员类型。
const typeof(((type *)0)->member) *__mptr = ptr :此部分为什么要重新定义__mptr呢?这就是写linux内核工程师的牛逼,严谨之处。如果开发者使 用时输入的参数有问题:ptr与member类型不匹配,编译时便会有warnning, 但是如果去掉改行,那个就没有了,而这个警告恰恰是必须的(防止出错有不 知道错误在哪里)。。。
2.2. 分析(type *)((char *)__mptr - offset_of(type,member));
(char *)__mptr :将成员类型强制转化为char *,如此地址进行加减时以字节为单位
(char *)__mptr - offset_of(type,member) :计算出结构体首地址,此时地址类型为char *
(type *)((char *)__mptr - offset_of(type,member)):将char * 强制转化为(type *)
索引文献:https://blog.csdn.net/s2603898260/article/details/79371024
关于container_of函数分析的更多相关文章
- split(),preg_split()与explode()函数分析与介
split(),preg_split()与explode()函数分析与介 发布时间:2013-06-01 18:32:45 来源:尔玉毕业设计 评论:0 点击:965 split()函数可以实 ...
- string函数分析
string函数分析string函数包含在string.c文件中,经常被C文件使用.1. strcpy函数原型: char* strcpy(char* str1,char* str2);函数功能: 把 ...
- start_amboot()函数分析
一.整体流程 start_amboot()函数是执行完start.S汇编文件后第一个C语言函数,完成的功能自然还是初始化的工作 . 1.全局变量指针r8设定,以及全局变量区清零 2.执行一些类初始化函 ...
- uboot的jumptable_init函数分析
一.函数说明 函数功能:安装系统函数指针 函数位置:common/exports.c 二.函数分析 void jumptable_init (void) { int i; gd->jt = (v ...
- Linux-0.11内核源代码分析系列:内存管理get_free_page()函数分析
Linux-0.11内存管理模块是源码中比較难以理解的部分,如今把笔者个人的理解发表 先发Linux-0.11内核内存管理get_free_page()函数分析 有时间再写其它函数或者文件的:) /* ...
- 31.QPainter-rotate()函数分析-文字旋转不倾斜,图片旋转实现等待
在上章和上上上章: 28.QT-QPainter介绍 30.QT-渐变之QLinearGradient. QConicalGradient.QRadialGradient 学习了QPainter基础绘 ...
- 如何验证一个地址可否使用—— MmIsAddressValid函数分析
又是一篇内核函数分析的博文,我个人觉得Windows的内核是最好的老师,当你想实现一个功能之前可以看看Windows内核是怎么做的,说不定就有灵感呢:) 首先看下官方的注释说明: /*++ Routi ...
- STM32F10X固件库函数——串口清状态位函数分析
STM32F10X固件库函数——串口清状态位函数分析 最近在测试串口热插拔功能的时候,意外发现STM32F10X的串口库函数中,清理串口状态位函数稍稍有点不解.下面是改函数的源码: /******** ...
- 常用string函数分析
string函数分析string函数包含在string.c文件中,经常被C文件使用.1. strcpy函数原型: char* strcpy(char* str1,char* str2);函数功能: 把 ...
随机推荐
- 8月清北学堂培训 Day1
今天是赵和旭老师的讲授~ 动态规划 动态规划的基本思想 利用最优化原理把多阶段过程转化为一系列单阶段问题,利用各阶段之间的关系,逐个求解. 更具体的,假设我们可以计算出小问题的最优解,那么我们凭借此可 ...
- 使用apktool工具遇到 could not decode arsc file 的解决办法
I: Using Apktool -Beta9 on xx.apk I: Loading resource table... Exception in thread "main" ...
- Robot Framework(十六) 扩展RobotFramework框架——使用监听器接口
4.3使用监听器接口 Robot Framework有一个侦听器接口,可用于接收有关测试执行的通知.监听器是具有某些特殊方法的类或模块,它们可以用Python和Java实现.监听器接口的示例用法包括外 ...
- js中那些方法不改变原来的数组对象
一.map方法 function fuzzyPlural(single) { var result = single.replace(/o/g, 'e'); //replace也不会修改原来数组的值, ...
- 【Phoenix】2、初始化 Phoenix 项目后的 目录结构
1.当我们创建的时候,Phoenix 为我们建立的根目录架构,如下: ├── _build ├── assets // 这个是放一下静态文件的,不如 js.css img 和 node_module ...
- 安装windows下安装mysql
参考文档:https://www.cnblogs.com/reyinever/p/8551977.html https://www.jb51.net/article/151213.htm 首先下载m ...
- Linux嵌入式学习过程(转载)
嵌入式专业是一门实践性非常强的学科,只有多动手,多实践,多编程,多调试,多看书,多思考才能真正掌握好嵌入式开发技术.那么,如何从零开始学习嵌入式开发技术, 进入嵌入式开发大门呢,笔者根据自己的嵌入式学 ...
- 13 Flutter仿京东商城项目 商品列表筛选以及上拉分页加载更多
ProductList.dart import 'package:flutter/material.dart'; import '../services/ScreenAdaper.dart'; imp ...
- mybatis问题。foreach循环遍历数组报错情况,及其解决方法
根据条件查询数据列表,mybatis查询代码如下 如果只查询属于特定部门拥有的数据权限.这需要用 String[ ] codes保存当前部门及其子部门的部门编码. 所以需要在mybatis中遍历编码数 ...
- opengl读取灰度图生成三维地形
准备第三方库 glew.freeglut.glm.opencv 准备灰度图片和草地贴图 最终效果 代码包括主程序源文件mainApp.cpp.顶点着色器shader.vs.片元着色器shader.fs ...