C – Usando una unión, asignando memoria

Tengo una estructura en C que se parece a esto

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

Es una cola circular básica. El valor del evento es una matriz de EventPointers, y se recorre cada X vez para sacar de la cola uno de los eventos. Se inicializa como

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

Lo que quiero decir es que quiero hacer una cola similar, con una funcionalidad similar, para poner en cola otro tipo de eventos similares pero con datos ligeramente diferentes. Inicialmente, solo quería tener colas separadas y atravesarlas por separado, pero la funcionalidad es muy repetida, parece que lo estoy haciendo mal. Imagine que la cola “hermana” es exactamente la misma, pero con un puntero a un tipo diferente para “evento”.

¿Debo usar un sindicato para esto en su lugar? como

 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; 

Pero en ese caso, ¿cómo asigno memoria para la matriz? ¿Debo mantenerlos separados, y esto es una mala idea?

Una solución es hacer que el tipo de evento básico sea una union , quizás una etiquetada:

 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; 

Ahora haz una serie de Event s. Para cada Event * p , puede inspeccionar e->kind.tag sin importar qué miembro de la unión está activo en ese momento (gracias a una regla especial relativa a las secuencias iniciales de miembros de la estructura).