C语言中有这样一个宏container_of
,它的作用是通过结构体的成员
,结构体成员的地址
以及结构体的类型
来获取结构体的首地址,原型如下:
#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
参数说明:
- ptr:结构体成员的地址
- type:结构体类型
- member:结构体成员
原理分析:结构体首地址 = 成员地址 - 成员偏移
,成员偏移
通过offsetof宏求出;
示例:
#include <stdio.h>
#define offsetof(type, member) (size_t) &((type*)0)->member
#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
typedef struct
{
char a;
int b;
float c;
}test_t;
void main(void)
{
test_t test, *p_test;
int *container_test = &(test.b);
p_test = container_of(container_test, test_t, b);
if(&test == p_test)
{
printf("Addr is samed\r\n");
}
}
输出:
Addr is samed