`
xiang37
  • 浏览: 429573 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

offsetof(TYPE, MEMBER)的宏定义

 
阅读更多

offsetof(TYPE, MEMBER)
该宏在Linux内核代码(版本2.6.22)中定义如下:
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER);
 
分析:
(TYPE *)0,将 0 强制转换为 TYPE 型指针,记 p = (TYPE *)0,p是指向TYPE的指针,它的值是0。那么 p->MEMBER 就是 MEMBER 这个元素了,而&(p->MEMBER)就是MENBER的地址,而基地址为0,这样就巧妙的转化为了TYPE中的偏移量。再把结果强制转换为size_t型的就OK了,size_t其实也就是int。
typedef __kernel_size_t  size_t;
typedef unsigned int __kernel_size_t;   
 
可见,该宏的作用就是求出MEMBER在TYPE中的偏移量。

转自:http://cutebunny.blog.51cto.com/301216/67517

分享到:
评论

相关推荐

    Linux下的两个经典宏定义.docx

    在Linux环境下,有两个经典的宏定义,它们分别是`offsetof`和`container_of`,这两个宏在系统内核编程和底层开发中非常常见。 1. `offsetof`宏定义: `offsetof`宏的主要作用是计算一个结构体成员相对于结构体起始...

    结构体中的偏移1

    为了解决这个问题,一些现代的编译器如GCC提供了内置函数`__builtin_offsetof`来替代传统的宏定义: ```c #define offsetof(st, m) __builtin_offsetof(st, m) ``` 这个内置函数可以更安全地计算偏移量,尤其是在...

    高手笔记 结构成员变量偏移量的两个应用

    `BEGIN_INTERFACE_TABLE`、`INTERFACE_TABLE_ENTRY`、`IMPLEMENTS_INTERFACE`、`IMPLEMENTS_INTERFACE_AS`以及`IMPLEMENTS_INTERFACE_WITH_COMPOSITE`等宏定义了一种方式来声明和初始化接口表。这些宏使得开发者能够...

    2014大疆嵌入式笔试题_嵌入式-常用知识&面试题库_大厂面试真题.docx

    宏定义XXX(ptr, type, member)的作用是计算成员变量member在结构体type中的偏移量。offsetof宏的定义为: ```c #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE*)0)->MEMBER) ``` 这个宏使用了指针运算来计算成员...

    Linux内核list&hlist;解读

    ((type *)((char *)(ptr) - offsetof(type, member))) ``` **2.3.2. 作用** 通过已知的结构体成员指针 `ptr`、结构体类型 `type` 和成员名 `member`,可以反向获取指向整个结构体的指针。 **2.3.3. 示例** 假设有...

    深度剖析C语言结构体

    这里,offsetof宏将TYPE结构体的MEMBER成员变量的偏移量计算出来。例如,在ST结构体中,offsetof(ST, id)将计算出id成员变量的偏移量,offsetof(ST, name)将计算出name成员变量的偏移量,以此类推。 6. 结构体的...

    Linux头文件.doc

    * `stddef.h`:定义了标准定义头文件,定义了 NULL, offsetof(TYPE, MEMBER)。 * `string.h`:定义了一些有关字符串操作的嵌入函数。 * `termios.h`:定义了终端输入输出函数头文件,主要定义控制异步通信口的终端...

    linux kernel list的应用

    (type *)( (char *)mptr - offsetof(type, member) );}) ``` 这里的`ptr`是指向链表节点的指针,`type`是你想要恢复的结构体类型,`member`是`type`结构体中链表节点所对应的成员名。`container_of`宏通过计算偏移...

    用C++实现反射的例子

    我们可以定义一个`DECLARE_MEMBER`宏,用于声明每个成员变量和函数,并将其添加到类的反射数据结构中。 ```cpp #define DECLARE_MEMBER(Type, Name) \ reflectData.members.push_back({#Name, offsetof(Class, ...

    JSON-C库的源码

    // 兼容不同Python版本的宏定义 #if PY_VERSION_HEX !defined(Py_TYPE) #define Py_TYPE(ob) (((PyObject*)(ob))->ob_type) #endif #if PY_VERSION_HEX !defined(PY_SSIZE_T_MIN) typedef int Py_ssize_t; #define ...

    算法学习资料:详解Linux内核之双向循环链表

    ((type *)((char *)(ptr) - offsetof(type, member))) 6. 遍历 Linux 内核中提供了多种遍历方式,例如: list_for_each(pos, head) list_for_each_entry(pos, head, member) 遍历可以根据需要选择合适的遍历...

    Linux内核中链表和散列表的实现原理揭秘

    (type *)((char *)__mptr - offsetof(type, member)); }) ``` **使用示例:** 假设有一个结构体`struct node`,其中包含一个链表节点`struct list_head head`,那么可以通过`container_of`宏从链表节点`head`恢复...

    C语言中结构体偏移及结构体成员变量访问方式的问题讨论

    它的语法是`offsetof(type, member)`,返回`member`在`type`类型的结构体中的偏移量。这个宏在`<stddef.h>`头文件中定义,但本质上是一个编译时的计算,不涉及运行时的函数调用。 在不依赖`offsetof`宏的情况下,...

    【博客大赛】《C和指针》摘抄整理型笔记五

    `offsetof(type, member)`返回`member`在`type`类型的结构体中的偏移值,以字节为单位。这在需要知道成员精确内存位置的情况下非常有用。 当我们向函数传递指针时,需要注意的一个关键点是,这样做的结果是函数可以...

    Linux内核链表实现过程

    (type *)((char *)__mptr - offsetof(type, member)); }) ``` 此宏可以接受链表节点的地址,并返回该节点所在的结构体地址。这对于遍历链表并访问其数据非常有用。 总结来说,Linux内核中的链表实现是一种高度...

    你必须知道的495个C语言问题

    offsetof(struct_name, member_name) ``` **2.13 怎样在运行时用名字访问结构中的域?** C语言本身不支持这样的功能,但可以通过创建查找表或使用反射技术来实现。 **2.14 程序运行正确,但退出时却“core dump”...

    linux内核 0.11版本源码 带中文注释

    定义了NULL, offsetof(TYPE, MEMBER)。 #include <stdarg.h> // 标准参数头文件。以宏的形式定义变量参数列表。主要说明了-个 // 类型(va_list)和三个宏(va_start, va_arg 和va_end),vsprintf、 // vprintf、...

Global site tag (gtag.js) - Google Analytics