结构体的一个疑问,请大家指教
typedef struct node
{
int data;
head *list;
}node;
typedef struct head
{
head *front;
head *back;
}
知道指针list的位置,如何通过list来推断出结构体node的位置呢。
[解决办法]
先找出list的偏移,也就知道了data的地址了。
typedef struct node
{
int data;
head *list;
}node;
求一个元素的偏移。
#define ELEM_OFFSET(Name, x) (&((Name*)0)->x)
如果 list的地址是 0x1234,
那么用list的地址去减去list的偏移。
0x1234 - ELEM_OFFSET(node, list)
[解决办法]
linux内核container_of宏定义分析
一、#define offsetof(TYPE, MEMBER) ((size_t) & ((TYPE *)0)->MEMBER )
二、container_of()
#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
[解决办法]
#define offsertof(s,m) (size_t) &(((s*)0)->m)
这个宏的功能是求成员m相对于结构体s的相对位置。
&(((s*)0)->m):(s*)0:将地址0转换为结构体指针
((s*)0)->m:获取上述结构体的成员变量m
&(((s*)0)->m):获取上述成员变量m的绝对地址
因为s的地址为0,所以上述绝对地址可以认为是成员变量m相对于结构体s的相对位置