我有两个结构体
struct X {
int x;
double *y;
};
struct Y {
int a;
double *b;
char c;
};按照struct Y标准,将指向struct X的指针转换为指向struct X的指针是否保证以合理的方式(即x->x和x->y分别对应于y->a和y->b )的行为保持一致?不太重要,但如果你碰巧也知道的话,这是否也适用于后来的标准(例如C11)和其他与C有显著语法和语义重叠的语言(例如C++XX,Objective)?
发布于 2015-10-26 20:13:01
这是不确定的行为。Python以前就依赖于这一点,并不得不修复它。如果将struct Y包含struct X作为其第一个元素,则可以将其用于类似的效果:
struct Y {
struct X a;
char c;
};
struct Y y;
struct X *x = (struct X *) &y; /* legal! */工会也有一个特例:
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标准的后期版本中,只有在这样的联合定义实际上在作用域内时,编译器才需要处理X和Y对象之间的混叠关系,但在C89中,编译器通常必须假定这样的定义存在于某个地方。但是,这仍然不能使将struct Y *转换为struct X *是安全的;如果编译器知道特定的struct Y不是联合的一部分,那么它可能仍然假定struct X *不可能对其进行别名。
发布于 2015-10-26 20:34:52
C89允许通过强制转换将指向一个对象类型的指针转换为指向另一个对象类型的指针。
然而,在我们进行取消引用之前,只有在原始指针的引用类型要求至少与结果指针引用的类型一样严格的情况下,转换后的指针才能有效。对齐完全依赖于实现。在您的特定示例中,这两个struct类型可能有相同的对齐要求,但不能保证这一点。
假设转换确实产生了一个有效的指针,那么标准并不能精确地定义struct成员是如何在struct对象的表示中被布置的。成员必须以与struct定义相同的顺序出现,在第一个填充之前不能有任何填充,但是没有定义其他细节。因此,在您的示例中,可以保证X->x将对应于Y->a (再次假设转换后的指针最初是有效的),但是X->y是否对应于Y->b还没有定义。
https://stackoverflow.com/questions/33354492
复制相似问题