Say I have the following types:
typedef struct TYPEA
{
int type;
char[12] id;
} TYPEA;
typedef struct TYPEB
{
int type;
int value;
} TYPEB;
I want to use create a union of these types and 'int', so that I can access the "type" int without needing to know whether TYPEA or TYPEB is stored in the union (the value of int lets me determine which is actually stored there). I can't get the right syntax though.
My union:
typedef union MEMBER
{
int type;
struct TYPEA a;
struct TYPEB b;
} MEMBER;
The union is accessed via:
typedef struct WRAPPER
{
union MEMBER* member;
struct WRAPPER* next;
} WRAPPER;
Questions:
- (With 'w' as a pointer to an allocated WRAPPER struct) Accessing using
w->member->a.id
gives "request for member 'id' in something not a structure or union.
- Can I assign a pointer to an already malloc'd TYPEA/B to w->member directly? Or does a union need to be malloced specially?
Thanks.
- Use
w->member->type
.
- You need to allocate the
union
specifically.
One note that may be a point of misunderstanding is that the union
holds EITHER the int
, or TYPEA
, or TYPEB
, so in particular you cannot rely on your int type;
in the union to tell you which struct
the union holds.
Edit to respond to question in comments:
You probably want something like this:
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
};
w->member.type
should be w->member->type
because w->member
is a pointer.
I don't know off the top of my head whether C will let you assign a TYPEA*
or TYPEB*
to a MEMBER*
- somehow I doubt it. You can always (MEMBER*)
it, but I would consider recomposing the struct
s to remove the int
tag and instead declare one struct
that includes the tag and a union
of TYPEA
and TYPEB
. The struct
s ideally shouldn't need to be concerned with the fact that they're in a union
.
You might want to check out the code in my question:
Union of structs with common first member
Essentially, I do what you want but I'm using an inner struct (contained
in the example) that's common to the two types. This struct can then be cast to gain access to the common elements of both types.