C – 使用union,分配内存

我有一个看起来像这样的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)); 

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

我应该使用联盟吗? 如

 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; 

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

一种解决方案是使基本事件类型成为union ,也许是标记的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无论当时哪个联盟成员处于活动状态(由于有关结构联合成员的初始序列的特殊规则)。