匿名联盟内部结构

时间:2017-05-25 05:14:02

标签: c struct unions anonymous

以下代码提供了一个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;
}

1 个答案:

答案 0 :(得分:0)

union指定两个成员都位于内存中的相同位置。因此,如果您分配到test1_struct,然后从test2_struct读取,则会将test1_struct的内容解释为test2_struct格式。

在这种情况下,两种结构都具有相同的格式,因此它不会对您读写的内容产生影响。使用两个成员都相同的联合通常没有意义。联合的通常目的是拥有不同类型的成员,但不需要为每个成员分别拥有单独的内存,因为您一次只需要使用一种类型。有关典型用例,请参阅How can a mixed data type (int, float, char, etc) be stored in an array?

请参阅Unions and type-punning,了解访问不同于您指定成员的成员的后果。