如何在 C 中保持全局存储区域类型独立?

How to keep a global storage area type independent in C?

我必须提前确保 space 足够多达 4k 个条目以任意比例分为两种不同类型,然后用数据填充。我以为我会分配 space 足以容纳 4k 的较大类型,然后决定用数据填充它实际上是什么类型。我 运行 遇到一个问题,编译器告诉我 error (etoa:1554): illegal type(s): ptr-to-void '+' int.

在我的初始化函数中,我分配 space 是这样的:

ser_dat_ch = calloc(LABEL_T_CNT,
        (sizeof(mpls_vpws_t) > sizeof(mpls_vpls_t)
        ? sizeof(mpls_vpws_t)
        : sizeof(mpls_vpls_t)));

其中 ser_dat_ch 在文件范围内声明如下:

static void *ser_dat_ch = NULL;

当我将数据加载到结构中时,我想做类似

的事情
rv = switch_mpls_vpws_data_get(lab, (mpls_vpws_t*)&ser_dat_ch[lab]);

,但这就是编译器对我咆哮的原因。有什么问题?

您不能索引空指针,因为元素类型的大小未知。因此,首先将指针向下转换为特定类型,然后才进行索引:

rv = switch_mpls_vpws_data_get(lab, &((mpls_vpws_t*)ser_dat_ch)[lab]);

编译器抱怨 + 运算符的原因是 ser_dat_ch[lab] 等同于 *(ser_dat_ch + lab).

在这种特殊情况下,我认为最简单的解决方案是创建一个包含联合类型的 4K 条目的缓冲区。

struct A {/**/};
struct B {/**/};

union AB {
    struct A a;
    struct B b;
};

union AB ser_dat_ch[4000];