![](/img/trans.png)
[英]Given a pointer to member a within a struct, write a routine that returns a pointer to the struct
[英]Given a pointer to a member within a struct, how to return a pointer to this struct?
这是一道面试题。 我不知道如何解决它。 任何人都可以帮助我:?
给定一个指向结构中成员 a 的指针,编写一个返回指向该结构的指针的例程。
谢谢!
首先,为了实现这一点,您需要知道封闭结构StructType
的类型和成员member
的名称。 那必须是给定的。 没有它,问题就没有解决方案。
其次,我不知道为什么其他答案坚持重新发明轮子(并在此基础上进行未定义和不可移植的黑客攻击)而不是使用标准的offsetof
宏。 使用offsetof
的答案是
StructType *pstruct =
(StructType *) ((char *) pmember - offsetof(StructType, member));
Linux kernel 代码(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
和任何成员,因此相应地更复杂。
给定一个名为s
的结构和一个名为m
的成员
struct s * BaseS(byte *p)
{
return (struct s *) (p - ((byte*) &(((struct s *)0)->m)));
}
这个想法是获取成员的偏移量并从指针中减去它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.