c - 如何以可移植的方式从指向结构成员的指针计算指向结构开头的指针?

标签 c pointers casting c11 c17

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

struct s
{
  T1 x;
  T2 y;
}

进一步,假设我们有一个 struct s 类型的对象:

struct s a;

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

T2 *q = &s.y;

我正在寻找的是一种可移植的方法,可以从 q 计算 struct s * 类型的指针 p 使得 p 指向对象 a

最佳答案

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

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

关于c - 如何以可移植的方式从指向结构成员的指针计算指向结构开头的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53895524/

相关文章:

c - 尝试运行此程序时出现段错误

java - 如何证明在项目中使用脚本语言是合理的

在函数中创建动态数组(calloc),并在 main 中使用它

c++ - 以某种方式将基类的指针强制转换为未知的子类?

c++ - 通用四叉树

c - 为什么将 NULL 转换为结构指针?

在 c 中创建自己的 malloc 函数

c++ - 将 C++ 函数指针转换为 c 函数指针

pointers - Fortran 如何释放链表?

C++ 将 void 指针转换为模板类