2012-01-02 3 views
0
struct test{ 
    unsigned long int asd[][3][6]; 
}; 

sizeof(struct test)戻り0すなわち次元のない配列フィールドは、その使用ですか?

struct test{ 
    unsigned long int asd[0][3][6]; 
}; 

の正確なエイリアスであれば、そのようなフィールド宣言のための任意の実用性がありますか?あなたはテンプレートのメタプログラミングのことも考えているかもしれませんが、それは常に驚くべきことです。

+0

「テンプレートメタプログラミング」はC++になります。 –

+0

最初のコードスニペットが有効であることに気づいていませんでした。どのコンパイラを使用していますか? –

+0

次元のない配列は不完全な型であるため、特定のコンテキストでのみ使用できます。 –

答えて

4

最初の例は、フレキシブルアレイメンバの機能、C99の使用方法を示しています。しかし、そのスニペットをコンパイルするために取得するためには、あなたのstruct内の別のメンバー、すなわち持っている必要があります:gccの上

struct test{ 
    int a; 
    unsigned long int asd[][3][6]; 
}; 

This documentationを理由sizeofゼロにevaulates、通常の配列の構文の違いを示しています:

ISO C90では、内容に長さ1を指定する必要があります。つまり、 はスペースを浪費するか、mallocの引数を複雑にします。 ISO C99で

は、わずかに 異なる構文およびセマンティクスにある、可撓性アレイ部材を使用する:

  • 可撓性アレイメンバーがコンテンツとして書き込まれている[] 0
  • フレキシブルアレイなしメンバは型が不完全なので、sizeof演算子が適用されない可能性があります。長さゼロの配列の元の実装 の奇妙な点として、sizeofはゼロと評価されます。
  • フレキシブルアレイメンバは、構造体の最後のメンバとしてのみ表示され、それ以外の場合は空ではありません。
  • フレキシブルな配列メンバーを含む構造体またはそのような構造体を含む共用体(再帰的に可能性があります)は、配列の構造体または要素の メンバーではない可能性があります。 (ただし、これらの用途 は拡張としてGCCによって許可されている。)
2

これはセクション6.7.2.1 C99 standard(3.7メガバイトのPDF)の段落16に記載された "フレキシブルアレイ部材"、です。

これはC99の新機能です。いくつかのコンパイラ(特にMicrosoftのもの)はそれをサポートしていないかもしれません。

フレキシブルな配列メンバーは構造体の最後のメンバーでなければならず、のメンバーのみがメンバーになることはできません。

comp.lang.c FAQの質問2.6に記載されている "struct hack"の代わりです。

0

メモリが制限されているカスタムメモリアロケータを搭載したシステムでは、次元が変更されていない配列を使用することができます。埋め込みソフトウェアで言います。

あなたは、構造体は以下のように定義している場合:

struct test 
{ 
    int a; 
    unsigned long int asd[][6][3]; 
}; 

とメモリプール:

int *b = new unsigned long int[1000]; 

あなたが '割り当て' メモリと、次のような構造を使用することができます。

test *t; 
t = (test*)b; 
t->asd[1][2][3] = 1; 

この方法は、指定された寸法の配列を作成するよりも柔軟性があります。もちろん、あなたは常に

struct test2 
{ 
    int a; 
    unsigned long int ***asd; 
}; 

のような構造を使用することができますが、個別にポインタを初期化する必要がありますし、ポインタ自体は4バイトを必要とします。 ポインタを使用しない場合のボーナスとして、構造体は線形メモリチャンクとして表され、そのまま直列化できます。

関連する問題