因为我的问题(链接)没有得到明确的答案,所以我再次提问希望有人知道:
- 指向联合体和包含其元素指针的联合体之间除了语法上的区别之外,是否存在任何区别?在此示例中生成的汇编代码相同。
- 只要我从未访问其他成员,就可以仅为其中一个成员(不是最大的成员)分配内存,这样做是否允许?
关于第二个问题,C89草案的第6.5.2.1节如下:
联合体的大小足以容纳其成员中最大的一个——联合体对象最多可以存储一个成员的值。适当转换为联合体对象的指针可以指向其每个成员(或者如果一个成员是位域,则指向它所在的单元),反之亦然。
因此,至少在正确转换时,仅为一个成员分配空间应该是可以的,但我找不到任何保证只使用所访问成员对应的位的内容的内容。
编辑:
给定以下定义:
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 Funion a, *b; b = malloc(sizeof Small); a.small.field1 = 1; *b = a;
将会溢出内存。您可以争辩说您永远不会那样做,并且逐字段复制“a”将起作用;可能会,但据我所知,标准并不保证它。 - rici