首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

构造体的一个疑问,请大家指教

2013-03-12 
结构体的一个疑问,请大家指教typedef struct node{int datahead *list}nodetypedef struct head{head *

结构体的一个疑问,请大家指教
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的相对位置

热点排行