0

假设T1T2是两种类型,并给出以下结构:

struct s
{
  T1 x;
  T2 y;
}

此外,假设我们有一个类型为 的对象struct s

struct s a;

由此,我们可以计算出指向对象第二个结构成员的指针:

T2 *q = &s.y;

我正在寻找的是一种可移植的方法,可以从q指向objectp的类型指针struct s *进行计算。pa

4

3 回答 3

4

给定T2 *q = &s.y;, 然后char *x = (char *) q - offsetof(struct s, y);定义一个x指向 的第一个字节的s. offsetof宏定义在<stddef.h>.

然后可能会期望struct s *p = (struct s *) x;定义p指向 的a s,这取决于人们希望如何迂腐地解释 C 标准。(将指针转换为指向char它的第一个字节的结构的指针并未由标准明确定义。我们可以将标准的规范中的指针“转换回”,在 C 2018 6.3.2.3 7 中,它的原始类型来涵盖这种情况。)我希望它可以在所有正常的 C 实现中工作。

于 2018-12-22T12:23:57.517 回答
1

您正在寻找container_of();来自维基百科

#define container_of(ptr, type, member) ((type *)((char *)(1 ? (ptr) : &((type *)0)->member) - offsetof(type, member)))

或更简单,但不太安全

#define container_of(ptr, type, member) ((type *)((char *)(ptr) - offsetof(type, member)))

在您的情况下,您可以像这样应用它

struct *s = container_of(q, struct s, y);
于 2018-12-22T13:30:56.353 回答
-1
T2 *py = &z.y

T1 *px = (T1 *)((char *)py - ((char *)&z.y - (char *)&z.x));
于 2018-12-22T12:36:20.763 回答