纯C 怎么利用枚举知道是什么类型的结构体

有很多的结构体(都是已知类型的结构体)放在一块内存中,需要从中找到需要的类型.
原来是 先定义一个需要的结构体指针AA * a , 然后要根据文档找到 这个结构体类型对应的枚举类型MA,
再调用 a = (AA *)* func(MA);
这样感觉很麻烦, 需要查找 两个东西 (一个是结构体类型 AA 一个是枚举MA)才能操作那块内存中的值;
#问: 有没有方法(或数据结构) 只需要知道一个东西(AA 或者MA) 就能够操作那块内存中的值呢?

代码在下面。我水平有限,希望能帮到你

#include
#include
#include

enum MA
{
ma_a,
ma_b,
};

struct AA
{
enum MA type;
int size;
void *data;
};

struct AB
{
enum MA type;
char string[64];
};

int main(int argc, const char *argv[])
{
struct AA a = {ma_a, 0, NULL};
struct AB b = {ma_b, "Hello World"};

void *pa = malloc(100);

//enum MA type = ma_a;
//memcpy(pa, &type, 4);
//memcpy(pa + 4, &a, sizeof(struct AA));

enum MA type = ma_b;
memcpy(pa, &type, 4);
memcpy(pa + 4, &b, sizeof(struct AB));

enum MA *t = (enum MA*)pa;
printf("type = %d\n", *t);
switch (*t)
{
case ma_a:
{
    struct AA *ta = (struct AA *)(pa + 4);
    printf("type %d, size %d\n", ta->type, ta->size);
    break;
}
case ma_b:
{
    struct AB *tb = (struct AB *)(pa + 4);
    printf("type %d, string %s\n", tb->type, tb->string);
    break;
}
default:
    break;
}

free(pa);

return 0;

}