【发布时间】:2017-05-25 05:14:01
【问题描述】:
以下代码提供了一个 O/P :
101:name_provided:name_provided
AFAIK 工会一次只能容纳一个成员,但看起来这两个值都是可见的,这是正确的还是代码有什么问题。
#include <stdio.h>
struct test1{
char name[15];
};
struct test2{
char name[15];
};
struct data{
int num;
union{
struct test1 test1_struct;
struct test2 test2_struct;
};
};
int main()
{
struct data data_struct={101,"name_provided"};
printf("\n%d:%s:%s",data_struct.num,data_struct.test1_struct.name,data_struct.test2_struct.name);
return 0;
}
【问题讨论】:
-
C 不会阻止您访问与您分配的工会成员不同的工会成员,这只是未指定的行为。虽然当两个结构相同时,我认为它总是可以的。
-
你希望发生什么?
-
@n.m. ,匿名联合中只有一个结构(test1_struct或test2_struct)可以保存值,另一个将打印垃圾
-
有时垃圾看起来合法只是因为它随机落在恰好存储合法值的内存区域中。但是,在您的情况下,输出定义明确而不是垃圾,因为两个联合成员是“相似”结构,并且语言标准专门定义了这种情况。所以它保证打印它打印的内容(而不是“发生打印”)。
-
还有一个小的代码更新,
struct test1{ char name[10]; }; struct test2{ char name[15]; };O/P 更改为:101:name_provi:name_provi是不是就像下面的代码一样,struct data data_struct={101,"name_provided"};test1_struct 的名称将获得值,并且test2_struct 的名称将打印垃圾,而不是为具有更大存储空间的成员分配内存。