这是一个面试问题。我不知道如何解决它。 任何人都可以帮助我:?
给出一个指向成员a的指针 结构,写一个例程 返回指向结构的指针。
谢谢!
答案 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)));
}
这个想法是获取成员的偏移量并从指针中减去它。