list_entry剖析与验证
2012-01-29 17:01
127 查看
/* &((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 *)型的指针。 */ #include <iostream> #include <typeinfo> using namespace std; struct list_head { struct list_head *next; struct list_head *prev; }; #define list_entry(ptr, type, member) \ ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member))) struct test_list { int testdata; float testfloat; struct list_head list; }; int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); struct test_list b; b.testdata = 5; b.testfloat = 11.2; struct test_list *pos = list_entry(&(b.testdata),struct test_list,testdata); cout << pos->testfloat << endl; return a.exec(); }
相关文章推荐
- Java 中Iterator 、Vector、ArrayList、List 使用深入剖析
- Java 中Iterator 、Vector、ArrayList、List 使用深入剖析
- LIST_ENTRY链表
- LevelDB源码剖析之SkipList
- ASP.NET MVC4中checkboxlist的验证实现
- leetcode 347. Top K Frequent Elements 将Hashmap统计次数的Entry,放到List<Entry>里面,对list排序后出现结果
- list_for_each_entry和list_for_each_entry_safe
- linux源码,list_entry阅读心得
- 节点地址的函数list_entry()原理详解
- Exchange Server 2010 OWA基于表单身份验证剖析
- ASP.NET DEMO18 验证GridView中由DropDownList控制CheckBoxList的选择项个数
- WorldWind源码剖析系列:插件列表视图类PluginListView和插件列表视图项类PluginListItem
- 【Java集合源码剖析】LinkedList源码剖析
- Java 中 Vector、ArrayList、List 使用深入剖析【转载】
- Java LinkedList 源码剖析
- 【java集合框架源码剖析系列】java源码剖析之LinkedList
- Vector、ArrayList、List使用深入剖析
- 内核链表list.h文件剖析
- java Arrays.asList()源码剖析
- 字符串String和list集合判空验证