Linux内核中双向链表的经典实现
副标题[/!--empirenews.page--]概要前面一章"介绍双向链表并给出了C/C++/Java三种实现",本章继续对双向链表进行探讨,介绍的内容是Linux内核中双向链表的经典实现和用法。其中,也会涉及到Linux内核中非常常用的两个经典宏定义offsetof和container_of。内容包括: 1. Linux中的两个经典宏定义 2. Linux中双向链表的经典实现 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3562146.html 更多内容: 数据结构与算法系列 目录 Linux中的两个经典宏定义倘若你查看过Linux Kernel的源码,那么你对 offsetof 和 container_of 这两个宏应该不陌生。这两个宏最初是极客写出的,后来在Linux内核中被推广使用。 1. offsetof 1.1 offsetof介绍 定义:offsetof在linux内核的include/linux/stddef.h中定义。 #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) 说明:获得结构体(TYPE)的变量成员(MEMBER)在此结构体中的偏移量。 (01) ( (TYPE *)0 ) 将零转型为TYPE类型指针,即TYPE类型的指针的地址是0。 (02) ((TYPE *)0)->MEMBER 访问结构中的数据成员。 (03) &( ( (TYPE *)0 )->MEMBER ) 取出数据成员的地址。由于TYPE的地址是0,这里获取到的地址就是相对MEMBER在TYPE中的偏移。 (04) (size_t)(&(((TYPE*)0)->MEMBER)) 结果转换类型。对于32位系统而言,size_t是unsigned int类型;对于64位系统而言,size_t是unsigned long类型。 1.2 offsetof示例 代码(offset_test.c)
1 #include <stdio.h>
2
3 // 获得结构体(TYPE)的变量成员(MEMBER)在此结构体中的偏移量。
4 #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
5
6 struct student
7 {
8 char gender;
9 int id;
10 int age;
11 char name[20];
12 };
13
14 void main()
15 {
16 int gender_offset, id_offset, age_offset, name_offset;
17
18 gender_offset = offsetof(struct student, gender);
19 id_offset = offsetof(struct student, id);
20 age_offset = offsetof(struct student, age);
21 name_offset = offsetof(struct student, name);
22
23 printf("gender_offset = %dn", gender_offset);
24 printf("id_offset = %dn", id_offset);
25 printf("age_offset = %dn", age_offset);
26 printf("name_offset = %dn", name_offset);
27 }
(编辑:佛山站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

