[英]Allocating memory for unions and difference between union pointer and union of pointers
由于我的问题在这里不能自信地回答说,我再问一次在这里希望有人知道确切原因:
关于第二个问题,C89草案的6.5.2.1说:
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);
我认为你误解了指向联合的东西。
使用示例代码的一部分(您应该在问题正文中使用)
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->aa
和u->ba
都是完全相同的大小并且位于完全相同的位置。 我认为它的方式是技术上它是UB但是因为其他要求而起作用。
如果您试图访问u->bb
,UB将得到保证。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.