linux 内核代码的offsetof()宏

转载 2015年07月08日 15:24:54
* 之前一直不理解((type *)0->member)是啥意思;甚至之前还在测试这种用法是否正确。
 * 这次在看list_entry的时候,又发现了这个用法。
 * 是在offsetof(type,member)中被调用的,
 * 原宏为:
#define offsetof(type,member) ((size_t) &((type *)0)->member)
 * size_t 是内核中的一种数据类型。是无符号的长整形。
 * 这个宏的作用是,计算元素member在其所在结构提type中的偏移量。
 * 那 看代码,还是不理解 。这不是在取member的地址么,还强制转化成size_t类型,
 * 怎么就是他在里面的偏移量了呢?甚至,用0->取元素,这种用法对还是错呢?
 * 哈哈,其实,重点就在用0->取元素上。
 *
 * 我们知道,定义结构体,内存会分配一块连续内存。结构体变量名也是该块连续内存的首地址。
 * 平时取元素 ,也是利用偏移量来进行操作。
 * 结构体内某一个元素的地址  =  结构体变量地址(即首地址)+ 偏移量。
 * 所以,如果结构体变量地址 == 0;
 * 该元素的地址 == 偏移量。
 * 所以,利用这样的小技巧,通过从0(NULL)作为首地址取元素,
 * 只要获取该元素的地址,就是该元素在其结构体内的偏移量了。

真的感叹c语言的巧妙,以及内核代码的构思,真真的灵活运用啊!

相关文章推荐

linux内核 宏offsetof 解析

1offsetof(s,m)解析 offsetof(s,m)解析  2   3今天看代码时,发现一个有用的东东,offsetof(s,m),这是一个宏,定义如下:  4  5 #define ...

Linux内核 container_of 宏和 offsetof 宏分析

1、#define offsetof(TYPE, MEMBER) ((size_t) & ((TYPE *)0)->MEMBER )宏功能:获得一个结构体变量成员在此结构体中的偏移量。1. ( (TY...

Linux 内核中宏 offsetof 与 container_of 的含义

在linux源码中经常会使用用成员指针得到当前结构体变量的指针,就是使用container_of,在定位源代码会看到如下: #define offsetof(TYPE, MEMBER) ((size_...

Linux内核 container_of 宏和 offsetof 宏分析

1、#define offsetof(TYPE, MEMBER) ((size_t) & ((TYPE *)0)->MEMBER ) 宏功能:获得一个结构体变量成员在此结构体中的偏移量。 ...

linux内核细节- typeof、offsetof、container_of

container_of链表是内核最经典的数据结构之一,说到链表就不得不提及内核最经典(没有之一)的宏container_of。 container_of似乎就是为链表而生的,它的主要作用是根据一个...

关于Linux/kernel.h中的offsetof和container_of宏

一、 位于Linux/kernel.h中 #define offsetof(s,m) (size_t)&(((s *)0)->m) #define container_of(ptr, type,...

linux offsetof在用户态C语言实现及示例

若需转载,请注明出处 linux系统提供的offsetof方法是得到一个结构体中的一个成员字段的此结构体中的偏移字节,现在用户态进行实现。 在用户态进行实现的例子:得到一个结构体中...

结构体之offsetof宏详细解析

1、#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE*)0)->MEMBER)     (include/linux/stddef.h) 1.1 ...

offsetof与container_of宏[总结]

转载自:http://www.cnblogs.com/Anker/p/3472271.html 1、前言   今天在看代码时,遇到offsetof和container_of两个...

offsetof 宏的简介

原文地址:http://baike.baidu.com/view/5513779.htm 定义   在stddef.h头文件中,该宏的完整说明如下:     #ifdef __cplusplus...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)