C - 使用union,分配内存

时间:2011-11-21 16:33:20

标签: c unions

我有一个看起来像这样的C结构

typedef struct event_queue{
Event* event;
int size;
int front;
int count;
int delay;
} event_queue;

这是一个基本的循环队列。事件值是一个EventPointers数组,每X次遍历一次以使其中一个事件出列。 它初始化为

p->event = calloc(p->size, sizeof(Event));

事实上,我想做一个具有类似功能的类似队列来排队其他类型的类似事件,但数据略有不同。最初我只想拥有单独的队列并分别遍历它们,但功能如此重复,似乎我只是做错了。 想象一下,“姐妹”队列完全相同,但指向“事件”的不同类型的指针。

我应该使用联盟吗?比如

typedef struct event_queue{
union{
  Event* event;
  VisualEvent* visual;
} data;
unsigned char* datatype; //array of same size as data for every individual member
int size;
int front;
int count;
int delay;
} event_queue;

但在这种情况下,我如何为阵列分配内存?我应该将它们分开,这是一个坏主意吗?

1 个答案:

答案 0 :(得分:3)

一种解决方案是使基本事件类型为union,可能是标记的:

enum EEventType { TypeOne, TypeTwo };

typedef struct EventTag_
{
  EEventType tag;
} EventTag;

typedef struct EventOne_
{
  EEventType tag;
  // real data for this event type;
} EventOne;

typedef struct EventTwo_
{
  EEventType tag;
  // real data for the sister event type;
} EventTwo;

typedef union Event_
{
  EventTag kind;
  EventOne event1;
  EventTwo event2;
} Event;

现在制作一个Event的数组。对于每个Event * p,无论当时哪个联盟成员处于活动状态,您都可以检查e->kind.tag(由于有关结构联合成员的初始序列的特殊规则)。