首页 > 解决方案 > 如何以可移植的方式从指向结构成员的指针计算指向结构开头的指针?

问题描述

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

struct s
{
  T1 x;
  T2 y;
}

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

struct s a;

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

T2 *q = &s.y;

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

标签: cpointerscastingc11c17

解决方案


给定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 实现中工作。


推荐阅读