terrycpp

C++博客 首页 新随笔 联系 聚合 管理
  13 Posts :: 0 Stories :: 0 Comments :: 0 Trackbacks
项目里面用到了list_head结构体,出现了问题,该问题与这篇主题无关,而且尚未解决,可能是<linux/list.h>库没被包含吧,要晚上回去再研究。
找问题原因的时候看了看list_head的定义,是下面这样的
1struct list_head {
2    struct list_head *next, *prev;
3}
于是觉得奇怪,这个结构怎么来保存数据呢?
上网查了之后长见识了,原来还可以这样。
list_head在别的结构中是充当“栏位”的角色,即拿到list_head之后,可以根据偏移位数来得到原结构变量的起始地址。
可以使用list_entry来取得入口地址,list_entry定义如下:
1 #define list_entry(ptr, type, member) \
2((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member))) 
使用例子:
1list_entry( &sb1.s_list, struct super_block, s_list)
上面例子可以用来根据s_list地址来取得sb1这个super_block结构体变量的地址。
posted on 2010-11-08 11:23 terrycpp 阅读(498) 评论(0)  编辑 收藏 引用 所属分类: linux

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理