【发布时间】:2016-10-09 23:19:12
【问题描述】:
我有一个union 包含各种兼容的struct 成员:
enum Type { T1, T2, … };
struct S1 { enum Type type; … };
struct S2 { enum Type type; … };
…
union U {
enum Type type;
struct S1 as_s1;
struct S2 as_s2;
…
};
这些结构的type字段被视为不可变的,只有当前type对应的union的字段被访问。我知道只要 type 不变量得到支持,就定义了将 union U * 转换为 struct S1 *,但反过来也是如此吗?
struct S1 *s1 = malloc (sizeof (struct S1));
union U *u = (union U *)s1;
也就是说,只分配sizeof (struct S1) 字节并将结果转换为union U * 是否安全?我想避免分配 sizeof (union U) 字节,在我的情况下可能会大得多。
【问题讨论】:
-
为什么会有
type工会成员?将类型放入一个包装对象泛型包装器中以实现多态性。 -
@self:这是 C,不是 C++。只是一个标准的标记联合。
-
没错。你不需要 C++ 来做我在评论中描述的事情。将其转换为 union 很好,因为 sizeof(your_union) 将是 union 所有成员的最大大小。您一次只能访问工会的一名成员
-
@self:我知道我可以转换值,我只是想知道是否还定义了指针转换,因为联合可以更严格地对齐,并且允许 @987654334 似乎很奇怪@ 实际上不能被取消引用——在上面的例子中,
*u肯定是非法的。 -
@self:我猜你的意思是
struct Wrapper { enum Type type; union { struct S1 as_s1; … } data; };?这也有同样的问题。
标签: c struct casting undefined-behavior unions