2015-09-22 7 views
8

私は3つの要素の配列を持っています。しかし、私はそれらのうちの2つを初期化したいだけです。 3番目の要素を空白にします。C言語の配列で初期化されていない要素の値

unsigned char array[3] = {1,2,}; 
int main(){ 
    printf("%d",array[2]); 
    return 0; 
} 

印刷結果は0です。これをIARと一部のオンラインコンパイラでテストしました。

3番目の要素の値にはCルールがありますか? 3番目の要素を0xFFで埋めるコンパイラはありますか? (特にクロスコンパイラ)

答えて

10

はい、この場合、Cの標準では何が起こるかを定義しています。したがって、この場合は0xFFで初期化するC標準準拠のコンパイラはありません。標準の

6.7.9項は言う:

初期化

...

10 ...静的またはスレッド記憶域期間を持つオブジェクトが されていない場合その後、明示的に初期化:

  • それはポインタ型を持つ場合NULLポインタに初期化されます。
  • 算術型の場合は、(正または符号なし)ゼロに初期化された です。
  • 集合体の場合、 これらの規則に従ってすべてのメンバーが(再帰的に)これらの規則に従って初期化され、 となり、パディングはゼロビットに初期化されます。
  • 共用体の場合、最初の名前付きメンバはこれらの規則に従って(再帰的に)初期化され、パディングはゼロビットに初期化されます。

...

21は、アレイを初期化するために使用 文字列リテラルの要素又は集合体のメンバー、またはより少ない文字が存在するよりも括弧で囲まれたリスト内の少ない初期化子が存在する場合既知のサイズは であり、配列内の要素であるため、残りの部分は、 であり、暗黙的に静的記憶域を持つオブジェクトと同じになります duration。

0

投稿this投稿から、その構文はコンマの後のすべての要素を0に初期化するように見えます。さらに、プログラムのデータセグメント内のすべての初期化されていないデータ(つまり、初期化されていないグローバル変数すべて)は自動的にゼロに設定されるため、このプログラムで未定義の動作を探している場合は、

0

これは、以下のようにgcc拡張で実現できます。 符号なし文字配列[10] = {1,2、[2 ... 9] = 0xFF};

+2

実際に質問には答えません。 OPは、未定義のインデックスがどのような値で初期化されているかについてのルールがあるかどうかを知りたがっており、コンパイラは暗黙的にそれらを0xFFに初期化します(標準準拠のコンパイラはそうしません)。 –

関連する問題