加入收藏 | 设为首页 | 会员中心 | 我要投稿 佛山站长网 (https://www.0757zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Linux > 正文

Linux内核中双向链表的经典实现

发布时间:2016-10-13 19:44:58 所属栏目:Linux 来源:网络整理
导读:概要 前面一章介绍双向链表并给出了C/C++/Java三种实现,本章继续对双向链表进行探讨,介绍的内容是Linux内核中双向链表的经典实现和用法。其中,也会涉及到Lin
副标题[/!--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 }

(编辑:佛山站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读