使用C语言中的结构联合

说我有以下类型:

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->成员吗? 或者工会是否需要特别加工?

谢谢。

  1. 使用w->member->type
  2. 您需要专门分配union

可能是误解点的一个注意事项是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. 您将member字段定义为指针,因此您应该使用w->member->type而不是w->member.type
  2. 你应该malloc联合类型。 分配联合时,您将获得一个sizeof等于union中最大元素的结构。 如果您尝试将结构复制到联合指针中,则会使对齐变得混乱。

w->member.type应该是w->member->type因为w->member是一个指针。

我不知道C会不会让你给MEMBER*分配一个TYPEA*TYPEB* MEMBER* – 不知怎的,我对此表示怀疑。 你可以随时(MEMBER*)它,但我会考虑重新组合struct来删除int标签,而是声明一个包含标签和TYPEATYPEB unionTYPEBstruct理想情况下不应该关注它们在union的事实。

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

共同第一成员的结构联盟

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