使用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;
问题:
- (使用’w’作为指向已分配的WRAPPER结构的指针)使用
w->member->a.id
访问,在不是结构或联合的情况下给出“成员’id’的请求。 - 我可以直接将指向已经malloc的TYPEA / B的指针指定给w->成员吗? 或者工会是否需要特别加工?
谢谢。
- 使用
w->member->type
。 - 您需要专门分配
union
。
可能是误解点的一个注意事项是union
持有int
, TYPEA
或TYPEB
,因此特别是你不能依赖你的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 };
- 您将
member
字段定义为指针,因此您应该使用w->member->type
而不是w->member.type
。 - 你应该
malloc
联合类型。 分配联合时,您将获得一个sizeof
等于union中最大元素的结构。 如果您尝试将结构复制到联合指针中,则会使对齐变得混乱。
w->member.type
应该是w->member->type
因为w->member
是一个指针。
我不知道C会不会让你给MEMBER*
分配一个TYPEA*
或TYPEB*
MEMBER*
– 不知怎的,我对此表示怀疑。 你可以随时(MEMBER*)
它,但我会考虑重新组合struct
来删除int
标签,而是声明一个包含标签和TYPEA
和TYPEB
union
的TYPEB
。 struct
理想情况下不应该关注它们在union
的事实。
您可能想查看我的问题中的代码:
共同第一成员的结构联盟
基本上,我做你想要的,但我使用的是内部结构( contained
在示例中),这两种类型是共同的。 然后可以转换此结构以访问两种类型的公共元素。