`

C的offsetof和container_of

 
阅读更多

#include <stdio.h>

#include <stddef.h>

// #define offsetof(s, m)   (size_t)&(((s *)0)->m)

 

struct A

{

        int a;

        int b;

};

 

int main()

{

        printf("%d\n", offsetof(struct A, b));

        return 0;

}

http://blog.csdn.net/pengzhixi/article/details/4275887

 

#define container_of(ptr, type, member) \

  ((type *) ((char *) (ptr) - offsetof(type, member)))

 

分享到:
评论

相关推荐

    详解Linux内核中的container_of函数

    `container_of`的基本原理是基于指针的运算和类型安全的考虑。其工作方式如下: 1. **类型定义**:首先,`container_of`会创建一个临时变量`__mptr`,它的类型与`ptr`相同,这通常是一个指向结构体成员的指针。这个...

    结构体中的偏移1

    总的来说,`offsetof`宏和与其相关的`container_of`宏是C语言编程中提高效率和灵活性的重要工具,它们在处理复杂数据结构时发挥着关键作用,尤其是在操作系统、设备驱动和其他需要高效内存管理的领域。然而,正确...

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

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

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

    假设有一个结构体`struct node`,其中包含一个链表节点`struct list_head head`,那么可以通过`container_of`宏从链表节点`head`恢复出完整的`struct node`指针: ```c struct node { int value; struct list_head...

    linux kernel list的应用

    了解了基本的链表操作和`container_of`宏后,我们可以编写更复杂的代码,例如处理内核模块的注册、设备驱动的管理等。链表的灵活性使得它成为Linux内核中不可或缺的一部分,广泛应用于任务调度、内存管理、设备驱动...

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

    结构成员变量偏移量在计算机科学,特别是在C语言编程中是一个重要的概念,它与内存布局和数据结构的高效访问紧密相关。本文将深入探讨结构成员变量偏移量的两个主要应用,分别是`container_of`宏的实现和COM接口表的...

    Linux内核list&hlist;解读

    结合 `container_of` 使用,使得从指向链表节点的指针转换为指向包含该节点的结构体指针变得简单。 #### 3.4. list_for_each **3.4.1. 定义** `list_for_each` 用于遍历整个链表。 ```c #define list_for_each(pos...

    深度剖析C语言结构体

    Linux内核的实现博大精深,从offsetof的实现到后面的container_of,为什么通过结构体的的成员就能获得整个结构体的指针呢?这就得益于offsetof宏的实现。关于这个宏,前面的博文也有讲解,但不够深入,今天的这个...

    Linux内核链表实现过程

    #define container_of(ptr, type, member) ({ \ const typeof(((type *)0)-&gt;member) *__mptr = (ptr); \ (type *)((char *)__mptr - offsetof(type, member)); }) ``` 此宏可以接受链表节点的地址,并返回该节点...

Global site tag (gtag.js) - Google Analytics