1

次のように2つの構造体タイプがあるとしましょう。

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, }),
};

また、配列内の要素のタイプを知る必要があるため、構造体の前にcharを配置する方法も便利です。:)

これはひどく壊れているように見えますが、バイトコードのようなデータ構造を一緒にパックしようとしています。これは、それらを定義するためのエレガントな方法のように見えます(少なくともいくつかのマクロの助けを借りて)。

編集:いくつかのポイントを明確にするために:

  • 動的割り当てはオプションではありません
  • ユニオンでもありません-要素がそのタイプに必要なスペースを正確に占めるようにしたい
  • http://gcc.gnu.org/onlinedocs/gcc/Zero-Length.htmlによると、質問の「可変長配列」は誤解を招く可能性があります。正確な単位は「柔軟な長さ配列」です。サンプルコードは、理想的にはどのように表示したいかです。

したがって、基本的に私が望んでいるのは、バイナリの.dataセグメントに割り当てられているメモリ領域に、任意の構造化データをパックできるようにすることです。構造体からのデータをパックするためだけに、要素にランダムアクセスする必要はありません。私の例で柔軟な長さの配列を使用するのは、この構造体が私が達成したいものに最も近いように見えるためです。しかし、宣言はその仕事をする他のものである可能性があります(アセンブラーを除いて、私はCの移植性を保持する必要があります)。

4

1 に答える 1

5

これに最適な方法は、ユニオンを使用することです。unionこのユニオンと、実際のタイプを に定義するために必要な を含む、charすべてのタイプを定義できます。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型が同じ長さでない場合、メモリ レイアウトによってスペースが失われることに注意してください。実際、上記の定義では、A または B の大きい方と char を保持するのに十分な大きstruct TypesABさで定義されます。A として使用すると、メンバーsizeofに使用されていたはずのメモリ空間が失われます。のメンバーと のメンバーに同じメモリ空間が使用されます。caAbB

于 2012-11-22T10:13:52.717 に答える