由于我的问题here无法自信地回答,我再次在这里问,希望有人确切知道:
关于第二个问题,C89草案的6.5.2.1说:
union的大小足以包含其最大的成员 - 最多一个成员的值可以随时存储在union对象中。指向union对象的指针适当地转换为指向其每个成员的指针(或者如果成员是位字段,则指向它所在的单位),反之亦然。
所以,至少在正确转换时,只为其中一个成员分配空间应该没问题,但我找不到任何保证在使用union时只使用被访问成员的相应位的东西。
编辑:
鉴于以下定义:
typedef struct s1
{
int a;
} s1;
typedef struct s2
{
int a;
int b;
} s2;
union u1
{
s1 a;
s2 b;
};
这是合法的吗?
union u1 *u = malloc(sizeof(s1));
u->a.a = 3;
printf("s1.a=%d\n", u->a.a);
printf("s2.a=%d\n", u->b.a);
答案 0 :(得分:2)
我认为你误解了指向联合的东西。
使用示例代码的一部分(您应该在问题正文中使用)
union u1
{
s1 a;
s2 b;
};
然后,如果你有
union u1 my_union;
保证&my_union
等于例如&my_union.a
和 &my_union.b
。
关于
union u1 *u = malloc(sizeof(s1));
u->a.a = 3;
printf("s1.a=%d\n", u->a.a);
printf("s2.a=%d\n", u->b.a);
这只能起作用,原因有二:使用联合会允许使用类型 - 双关语,u->a.a
和u->b.a
的大小完全相同且位置完全相同。我认为它的方式是技术上它是UB但是因为其他要求而起作用。
如果您尝试访问u->b.b
,则可以保证UB。