int array[0];
is Invalid C code.非標準準拠です。コンパイラ固有の拡張機能を使用しているため、コードは正常にコンパイルされます。
参照:
C99 標準: 6.7.5.2 配列宣言子
Para 1:
オプションの型修飾子とキーワード static に加えて、[ と ] で式または を区切ることができ*
ます。それらが式 (配列のサイズを指定する) を区切る場合、式は整数型を持つ必要があります。式が定数式の場合、値は 0 よりも大きくなければなりません。要素の型は、不完全型または関数型であってはなりません。オプションの型修飾子とキーワード static は、配列型を持つ関数パラメーターの宣言にのみ表示され、その後、最も外側の配列型の派生にのみ表示されます。
が機能しているように見えるのはなぜですか?
コンパイラの実装で長さゼロの配列が許可されていると仮定します。
array[0] = 5;
このコード ステートメントはUndefined Behaviorを引き起こすため、引き続き機能します。
配列が所有していないメモリ領域に書き込み、割り当てられたメモリの境界を上書きします。幸いなことに、メモリはおそらく他のエンティティによって使用されていないため、機能します。技術的には、これはまだ未定義の動作です。