说我有以下类型:
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->member->a.id
进行访问会在非结构或联合的情况下提供“成员'id'的请求。感谢。
答案 0 :(得分:10)
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
};
答案 1 :(得分:1)
member
字段定义为指针,因此您应该使用
w->member->type
代替w->member.type
。malloc
联合类型。分配联合时,您将获得一个sizeof
等于联合中最大元素的结构。如果你试图将结构复制到联合指针中,你就会搞乱对齐。答案 2 :(得分:0)
w->member.type
应为w->member->type
,因为w->member
是指针。
我不知道C是否允许您将TYPEA*
或TYPEB*
分配给MEMBER*
- 不知怎的,我对此表示怀疑。您可以随时(MEMBER*)
,但我会考虑重新组合struct
以删除int
代码,而是声明一个struct
包含代码和union
} TYPEA
和TYPEB
。 struct
s理想情况下不应该关注它们在union
中的事实。
答案 3 :(得分:0)
您可能想查看我的问题中的代码:
Union of structs with common first member
基本上,我做你想做的事,但我使用的是内部结构(示例中为contained
),这两种类型是共同的。然后可以转换此结构以访问这两种类型的公共元素。