container_of 详解
来源:互联网 发布:淘宝购枪暗语 编辑:程序博客网 时间:2024/05/21 16:55
container_of 详解
我们经常在linux内核中看到container_of宏,使用这个宏的就可以很容易地获得某数据结构中某成员的入口地址。
#define container_of(ptr, type, member) ({ /
const typeof( ((type *)0)->member ) *__mptr = (ptr); /
(type *)( (char *)__mptr - offsetof(type,member) );})
关于offsetof请见stddef.h中:
#define offsetof(TYPE,MEMBER) ((size_t)&((TYPE*)0)->MEMBER),TYPE是某struct的类型,0是一个假想的TYPE类型struct,MEMBER是该struct中的一个成员。由于该struct的基地址为0,MEMBER的地址就是该成员相对于struct头地址的偏移量。关于typeof,这是gcc的C语言扩展保留字,用于声明变量类型。const typeof( ((type *)0)->member ) *__mptr = (ptr); 意思是声明一个与member同一个类型的指针变量*__mptr ,并初始化为ptr。 (type *)( (char *)__mptr - offsetof(type,member) )意思是_mptr的地址减去member在该struct中的偏移量得到的地址,再转换成type型指针,那么该指针就是member的入口地址了。
下面用一个具体的例子来说明:
测试程序test.c如下:
#include<stdio.h>
struct student{
char name[20];
char sex;
}stu={"zhangsan",'m'};
main()
{
struct student *stu_ptr;//存储container_of宏的返回值
int offset;//存储offsetof宏的返回值
//下面三行代码等同于 container_of(&stu.sex,struct student, sex )参数带入的情形
const typeof(((struct student*)0)->sex) *_mptr = &stu.sex;
//首先定义一个 _mptr指针, 类型为struct student结构体中sex成员的类型
//typeof 为获取(((struct student*)0)->sex)的类型,此处此类型为char
//((struct student*)0)在offsetof处讲解
offset = (int)(&((struct student *)0)->sex);
/*((struct student*)0)为 把 0地址 强制转化为指向student结构体类型的指针
该指针从地址 0 开始的 21个字节用来存放name 与 sex(char name〔20〕与 char sex共21字节)
sex存放在第20个字节出(从0字节开始)
&((struct student *)0)->sex 取出sex地址(此处即为20) 并强制转化为整形
所以offset为20,后面的printf结果将证明这一点*/
stu_ptr = (struct student *)((char*)_mptr - offset);
/*((char*)_mptr - offset)此处先把_mptr指针转化为字符形指针
(为什么这么做呢? 如果_mptr为整形指针 _mptr - offset 相当于减去 sizeof(int)*offset个字节)减去 offset值 相当于 得到_mptr所在结构体的首地址(即stu的地 址)然后我们把该地址强制转化为struct student类型即可正常使用了*/
printf("offsetof stu.sex = %d/n",offset);
printf("stu_ptr->name:%s/tstu_ptr->sex:%c/n", stu_ptr->name, stu_ptr->sex);
return 0;
}
- container_of详解
- container_of详解
- container_of 详解
- container_of详解
- container_of详解
- container_of 详解
- container_of 详解
- container_of()详解
- Container_of详解
- container_of 详解
- container_of 解析 理解 详解
- container_of 解析 理解 详解
- 详解container_of宏
- 宏 container_of 详解
- linux内核container_of详解
- container_of宏详解
- container_of宏详解
- container_of,typeof详解
- 第二周C++实验报告(3)
- hibernate 核心包说明
- C++类中static成员函数的声明与实现
- zoj 2099 Frame Polygonal Line
- Android 用户界面---菜单(Menus 二)
- container_of 详解
- vlc+fedora15+精简
- android滑动之Scroller
- 2410从WinCE4.2到WinCE6.0移植过程(前言)
- Qt 2D绘图(九)双缓冲绘图简介
- 设计一个工资类函数
- 【内存池系列】提高C++性能的编程技术 学习笔记(二) 内存池
- C#中这样用Sleep()...
- 初始化,申明变量