2011-12-24 17 views

答えて

9

CもC++も配列の長さがゼロでないため、プログラムは不正です。

(例えば、C++ 11、8.3.4/1: "[配列サイズ]がゼロより大きくなければならない"。)

(根拠の一点として、ゼロ長の配列が難しいであろう各オブジェクトに一意のアドレスがあるという要件と調整するのが混乱します。)

@sidyllが指摘しているように、長さゼロの配列はGCCのextensionとして利用できます。

+0

gccコンパイラでubuntu 10.04 –

+4

@ user1044137にエラーがありません:不正な形式であり、診断を受け付けないCとC++の両方のプログラムを書く方法はたくさんあります。その点について私のGCCは「警告:ISO C++はゼロサイズの配列を禁じている」と言っています。常にすべての警告を有効にする必要があります。 –

+1

** C ** **コンパイラで** C **の質問から** C **プログラムをコンパイルし、** C++ **の標準抜粋を投稿しているのはなぜですか? – sidyll

3

あなたは

  • フレキシブル配列メンバがフレキシブル配列メンバが不完全持っ0
  • なし[]の内容として記述されているC99を使用している場合、あなたはThe GCC manual

    にあなたの答えを見つけることができますしたがって、sizeof演算子は適用されない可能性があります。長さゼロの配列の元の実装の奇妙な点として、sizeofはゼロに評価されます。

  • フレキシブルアレイメンバは、構造体の最後のメンバとしてのみ表示され、それ以外の場合は空ではありません。
  • フレキシブルな配列メンバーを含む構造体またはそのような構造体を含む共用体(おそらく再帰的に)は、配列の構造体または要素のメンバーではない可能性があります。 (ただし、これらの用途を拡張としてGCCによって許可されている

そしてもちろん、それらがどのように役立つことができます:。

ゼロ長配列はGNU Cで許可されている彼らは非常に便利です本当に可変長オブジェクトのヘッダである構造体の最後の要素として:

struct line { 
    int length; 
    char contents[0]; 
}; 

struct line *thisline = (struct line *) 
    malloc (sizeof (struct line) + this_length); 
thisline->length = this_length; 
+1

C11とC99では、 'sizeof'は必ずしもコンパイル時の演算子ではありません(C89でのみ)。 –

1

ずっとあなたの例で与えられるよう使用していますが、ゼロサイズの配列はありませんSは、しばしば、最後の要素は動的にサイズ決めされた構造で使用した:

struct { 
    int some_fixed_data [N_FIXED]; 
    float more_fixed_size_data [F_FIXED]; 
    int n_variable_elements; 
    long variable_elements [0]; // allocated based on item above 
} s; 

int curlen = sizeof s + sizeof long * s.n_variable_elements; 

ゼロ長配列の使用である:

1)variable_elements誰かの答えにもかかわらず、アドレス()
2を有している)、それまた、配列の動的なサイズを計算
3)技術的に、融和、間違った

は残念ながら、いくつかのコンパイラ(MSC)は、このような構成上hissyフィットを投げるとあまりを強制する簡略化され、配列の意味を持っています改訂:

struct { 
    int some_fixed_data [N_FIXED]; 
    float more_fixed_size_data [F_FIXED]; 
    int n_variable_elements; 
    long variable_elements [1]; // allocated based on item above 
} s; 

int curlen = sizeof s + sizeof long + (s.n_variable_elements - 1); 

ゼロサイズの配列をプレースホルダーと考えてください。あなたが多くの組み込み環境の場合であるCを使用することを余儀なくされていない限り、これ以上行う必要はほとんどありません。

関連する問題