1

假设我们有两种结构类型,如下所示:

struct A {
    int a;
}

struct B {
    int b;
    int c;
}

是否可以使用指定的初始化程序初始化一个灵活长度的数组以包含 A 和 B 的实例例如:

<sometype> my_array[] = {
    ((struct A){ .a = 10, }),
    ((struct B){ .b = 1, .c = 5, }),
};

而且由于我需要知道数组中元素的类型,因此在结构之前放置一些字符的方法也很好。:)

我知道这看起来非常糟糕,但我正在尝试将一些类似字节码的数据结构打包在一起,这看起来像是一种定义它们的优雅方式(好吧,至少在一些宏的帮助下)。

编辑:澄清几点:

  • 动态分配不是一种选择
  • 联合也不是 - 我希望元素完全占据其类型所需的空间
  • 根据http://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html ,问题中的“可变长度数组”可能具有误导性 - 确切的名称将是“可变长度数组” 。理想情况下,示例代码是我希望它的样子。

所以我基本上想要的是能够将一些任意的结构化数据打包到在二进制文件的 .data 段中分配的内存区域中。我不需要随机访问元素,只需要从结构中打包数据 - 在我的示例中使用灵活长度数组是因为这个结构似乎与我想要实现的最接近。但是声明可以是其他任何可以完成工作的东西(除了汇编程序,我需要保留 C 的可移植性)。

4

1 回答 1

5

最好的方法是使用工会。您可以在 a 中定义所有类型union,包括这个 union 和char您想要定义什么是 a 的实际类型struct

struct TypesAB {
    char type;
    union {
        struct {
            int a;
        } A;
        struct {
            int b;
            int c;
        } B;
    };
};
enum {
    TypeA,
    TypeB
};

有了这个struct,你可以定义你的数组,然后设置元素。

struct TypesAB array[10];
array[0].type = TypeA;
array[0].A.a = 10;
array[1].type = TypeB;
array[1].B.b = 1;
array[1].B.c = 5;

A请注意,如果您的和B类型的长度不同,内存布局将使您失去一些空间。确实,用上面的定义,struct TypesAB将定义一个sizeof大到足以容纳较大的A或B,加上char。如果将其用作 A,则将丢失c用于该成员的内存空间。的成员和 的成员使用相同的内存空间。aAbB

于 2012-11-22T10:13:52.717 回答