给定指向结构中成员的指针,如何返回指向此结构的指针?

时间:2011-05-26 00:45:14

标签: c

这是一个面试问题。我不知道如何解决它。 任何人都可以帮助我:?

  

给出一个指向成员a的指针   结构,写一个例程   返回指向结构的指针。

谢谢!

3 个答案:

答案 0 :(得分:8)

首先,为了解决这个问题,你需要知道封闭结构StructType的类型和成员member的名称。那一定是给定的。没有它,问题就无法解决。

其次,我不知道为什么其他答案坚持重新发明轮子(并在其上进行未定义和非便携式黑客攻击),而不是使用标准的offsetof宏。使用offsetof时答案是

StructType *pstruct = 
  (StructType *) ((char *) pmember - offsetof(StructType, member));

答案 1 :(得分:5)

Linux内核代码(GPLv2许可)包括一个方便的container_of()宏:

#define container_of(ptr, type, member) ({                      \
        const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
        (type *)( (char *)__mptr - offsetof(type,member) );})

它的用法如下:

static inline struct ext3_inode_info *EXT3_I(struct inode *inode)
{
    return container_of(inode, struct ext3_inode_info, vfs_inode);
}

@ Richard的答案非常好;主要区别在于此代码被参数化为接受任何struct和任何成员,因此相应地更复杂。

答案 2 :(得分:4)

给定名为s的结构和名为m

的成员
struct s * BaseS(byte *p)
{
     return (struct s *) (p - ((byte*) &(((struct s *)0)->m)));
}

这个想法是获取成员的偏移量并从指针中减去它。