首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C89中,转换到不同结构的指针是否一定是有意义的?

在C89中,转换到不同结构的指针是否一定是有意义的?
EN

Stack Overflow用户
提问于 2015-10-26 19:57:16
回答 2查看 263关注 0票数 13

我有两个结构体

代码语言:javascript
复制
struct X {
  int x;
  double *y;
};

struct Y {
  int a;
  double *b;
  char c;
};

按照struct Y标准,将指向struct X的指针转换为指向struct X的指针是否保证以合理的方式(即x->xx->y分别对应于y->ay->b )的行为保持一致?不太重要,但如果你碰巧也知道的话,这是否也适用于后来的标准(例如C11)和其他与C有显著语法和语义重叠的语言(例如C++XX,Objective)?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-10-26 20:13:01

这是不确定的行为。Python以前就依赖于这一点,并不得不修复它。如果将struct Y包含struct X作为其第一个元素,则可以将其用于类似的效果:

代码语言:javascript
复制
struct Y {
    struct X a;
    char c;
};

struct Y y;
struct X *x = (struct X *) &y; /* legal! */

工会也有一个特例:

代码语言:javascript
复制
struct X {
  int x;
  double *y;
};

struct Y {
  int a;
  double *b;
  char c;
};

union XY {
    struct X x;
    struct Y y;
};

union XY xy;
xy.x.x = 0;
printf("%d\n", xy.y.a); /* legal! */

在C标准的后期版本中,只有在这样的联合定义实际上在作用域内时,编译器才需要处理XY对象之间的混叠关系,但在C89中,编译器通常必须假定这样的定义存在于某个地方。但是,这仍然不能使将struct Y *转换为struct X *是安全的;如果编译器知道特定的struct Y不是联合的一部分,那么它可能仍然假定struct X *不可能对其进行别名。

票数 7
EN

Stack Overflow用户

发布于 2015-10-26 20:34:52

C89允许通过强制转换将指向一个对象类型的指针转换为指向另一个对象类型的指针。

然而,在我们进行取消引用之前,只有在原始指针的引用类型要求至少与结果指针引用的类型一样严格的情况下,转换后的指针才能有效。对齐完全依赖于实现。在您的特定示例中,这两个struct类型可能有相同的对齐要求,但不能保证这一点。

假设转换确实产生了一个有效的指针,那么标准并不能精确地定义struct成员是如何在struct对象的表示中被布置的。成员必须以与struct定义相同的顺序出现,在第一个填充之前不能有任何填充,但是没有定义其他细节。因此,在您的示例中,可以保证X->x将对应于Y->a (再次假设转换后的指针最初是有效的),但是X->y是否对应于Y->b还没有定义。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33354492

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档