list_entry()宏
来源:互联网 发布:郑州淘宝摄影 编辑:程序博客网 时间:2024/05/19 12:25
list_entry()宏
#define list_entry(ptr, type, member) /((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))
ptr是指向list_head类型链表的指针,type为一个结构,而member为结构type中的一个域,类型为list_head,这个宏返回指向type结构的指针。在内核代码中大量引用了这个宏,因此,搞清楚这个宏的含义和用法非常重要。
设有如下结构体定义:
typedef struct xxx
{
……(结构体中其他域,令其总大小为size1)
type1 member;
……(结构体中其他域)
}type;
定义变量:
type a;
type * b;
type1 * ptr;
执行:
ptr=&(a.member);
b=list_entry(ptr,type,member);
则可使b指向a,得到了a的地址。
如何做到的呢?
先看&((type *)0)->member:
把“0”强制转化为指针类型,则该指针一定指向“0”(数据段基址)。因为指针是“type *”型的,所以可取到以“0”为基地址的一个type型变量member域的地址。那么这个地址也就等于member域到结构体基地址的偏移字节数。
再来看 ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member))):
(char *)(ptr)使得指针的加减操作步长为一字节,(unsigned long)(&((type *)0)->member)等于ptr指向的member到该member所在结构体基地址的偏移字节数。二者一减便得出该结构体的地址。转换为 (type *)型的指针,大功告成。
- list_entry()宏
- list_entry()宏
- list_entry()宏
- list_entry()宏 .
- list_entry()宏详解
- list_entry()宏
- list_entry()宏
- 深入理解Linux内核list_entry()宏
- 内核链表list_entry()宏详解
- list_entry的宏定义
- 内核list_entry宏分析
- list_entry
- list_entry
- list_entry
- list_entry
- list_entry
- LIST_ENTRY
- list_entry()
- TortoiseSVN使用帮助和下载
- MVC2.0皮毛学习笔记(MVC2.0+VS2008)
- mfc doc view 记录备忘
- 飞鸽传书原创代码测试
- IBM INNOV8 介绍
- list_entry()宏
- php环境配置(windws)
- VS2008连接SQL2008时报错:“不支持此服务器版本,仅支持sql 2005以下版本的服务器”
- 我想回来了
- 让你受益一生的80句话
- 环境部署svn切换脚本编写
- 人生三件事不能等
- 在打开文件对话框上实现图象预览(转帖)
- VC环境下DLL接口申明的三种方式