使用C语言中的结构联合

时间:2013-12-23 23:06:20

标签: c unions

说我有以下类型:

typedef struct TYPEA
{
    int type;
    char[12] id;
} TYPEA;

typedef struct TYPEB
{
    int type;
    int value;
} TYPEB;

我想使用创建这些类型和'int'的联合,这样我就可以访问“type”int而无需知道TYPEA或TYPEB是否存储在union中(int的值让我确定哪个实际上存储在那里)。我虽然无法获得正确的语法。

我的工会:

typedef union MEMBER
{
    int type;
    struct TYPEA a;
    struct TYPEB b;
} MEMBER;

通过以下方式访问联盟:

typedef struct WRAPPER
{
    union MEMBER* member;
    struct WRAPPER* next;
} WRAPPER;

问题:

  1. (使用'w'作为指向已分配的WRAPPER结构的指针)使用w->member->a.id进行访问会在非结构或联合的情况下提供“成员'id'的请求。
  2. 我可以直接将指向已经malloc的TYPEA / B的指针分配给w->成员吗?或者工会是否需要特别加工?
  3. 感谢。

4 个答案:

答案 0 :(得分:10)

  1. 使用w->member->type
  2. 您需要专门分配union
  3. 可能有误解的一点是,union保留intTYPEATYPEB,所以特别是你不能依赖你工会的int type;告诉你工会有哪个struct

    编辑以回复评论中的问题:

    你可能想要这样的东西:

    struct TYPEA {
      char data[30]; // or whatever
    };
    
    struct TYPEB {
      double x, y; // or whatever
    };
    
    struct some_info {
      int type; // set accordingly
      union {
        struct TYPEA a;
        struct TYPEB b;
      } data; // access with some_info_object.data.a or some_info_object.data.b
    };
    

答案 1 :(得分:1)

  1. 您将member字段定义为指针,因此您应该使用 w->member->type代替w->member.type
  2. 您应该malloc联合类型。分配联合时,您将获得一个sizeof等于联合中最大元素的结构。如果你试图将结构复制到联合指针中,你就会搞乱对齐。

答案 2 :(得分:0)

w->member.type应为w->member->type,因为w->member是指针。

我不知道C是否允许您将TYPEA*TYPEB*分配给MEMBER* - 不知怎的,我对此表示怀疑。您可以随时(MEMBER*),但我会考虑重新组合struct以删除int代码,而是声明一个struct包含代码和union } TYPEATYPEBstruct s理想情况下不应该关注它们在union中的事实。

答案 3 :(得分:0)

您可能想查看我的问题中的代码:

Union of structs with common first member

基本上,我做你想做的事,但我使用的是内部结构(示例中为contained),这两种类型是共同的。然后可以转换此结构以访问这两种类型的公共元素。