container_of(ptr, type, member)详解
详解 of type container Member ptr
2023-09-11 14:21:44 时间
一、目的
第一次看到linux内核源码遇到这个container_of宏定义的时候难免会有些不知所措,其实这个宏定义的目的就是通过结构体成员的地址获取此结构体的首地址。
二、实战
参考资料
The Magical container_of() Macrohttps://radek.io/2012/11/10/magical-container_of-macro/
#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
其中offsetof获取结构体类型type中字段member的偏移地址;typeof获取类型;
当然不严谨的定义可以如下:
#define container_of(ptr, type, member) \
((type *)((char *)(ptr) - (char *)(&((type *)0)->member)))
举例说明
#include <stdio.h>
#define container_of(ptr, type, member) \
((type *)((char *)(ptr) - (char *)(&((type *)0)->member)))
typedef struct {
int x;
int y;
int z;
} foo_t;
int main(int argc, char **argv) {
foo_t a;
foo_t *pa = &a;
int *px = &a.z;
foo_t *pa2 = container_of(px, foo_t, z);
printf("pa: %p, pa2: %p\n", pa, pa2);
return 0;
}
pa: 0x7ffd37026d0c, pa2: 0x7ffd37026d0c
代码中我们使用container_of宏定义通过px的值获取到pa2,然后我们发现pa2与pa的值完全一致。
相关文章
- Mysql加锁过程详解(9)-innodb下的记录锁,间隙锁,next-key锁
- SQL Server-聚焦事务、隔离级别详解(二十九)
- mysql 之general_log日志开启详解以及清空
- fork failed because of Out Of Memory
- QT中事件发送函数sendEvent()、postEvent()详解
- 1034 Head of a Gang(详解,坑点及思路,哈希表存储每人的通话总时间)
- Android中内容观察者的使用---- ContentObserver类详解
- 详解文件IO操作
- 《极客学院 --NSAttributedString 使用详解-4-UITextKit 简介》学习笔记(待处理)
- 【51单片机】:定时器的详解(包括对单片机定时解释、各类定时方式,以及中断方式)
- IP协议详解