2017-11-12 6 views
0
#include <stdio.h> 

int main() 
{ 
    int a[5]={1} ; 
    int b[5]; 
    b[0]=1 ; 
    printf("\na[0]=%d, a[1]=%d, a[2]=%d, a[3]=%d, a[4]=%d",a[0],a[1],a[2],a[3],a[4]); 
    printf("\nb[0]=%d, b[1]=%d, b[2]=%d, b[3]=%d, b[4]=%d",b[0],b[1],b[2],b[3],b[4]); 

    return 0 ; 
} 

コードを見てください。私は2つの整数配列を部分的に割り当てました(1要素は5から割り当てられます)。Cアレイ割り当て手順 - 一度にまたは個別 - 部分配列割り当て - 異なる出力

最初のものは中括弧で一度に割り当てられます。

2番目の配列は、1つの配列インデックスにアクセスすることによって割り当てられます。

次に、配列全体を印刷しています。

1番目の配列で、割り当てられていないインデックスが0(ゼロ)になっています。そして、2番目の配列では、割り当てられていないインデックスにガベージ値があります。

説明してください。

ここで何が起こっているのか説明しないでください。しかし、なぜそれが起こっているのかを親切に説明してください。理由。

int a[5]={1} ; 

+0

いいえ、誰かがsam要素を割り当てる方法を尋ねました。しかし、ここでは問題があります。私はいくつかの方法で完全な配列を割り当てることはできません。なぜ値が異なっているのか。理由。 :) –

答えて

1

あなたは1への最初の要素を初期化し、残りは自動的に0に初期化されます。あなたは要素のいずれかを初期化しない

int b[5]; 
b[0]=1 ; 

、(定義の後に)配列の内容は不定になります。次に、1の値をb[0]に割り当て、残りの配列を初期化しないでください。

1

正しい動作です。

int a[5]={1} ; // 1,0,0,0,0 

アレイはこれらの値で初期化されます。

2番目のケースでは、b[0]のみが初期化されます。残りの要素には不確定な値が含まれます。

標準自体6.7.9.27[N1570]

例4

 int z[4][3] = { 
      { 1 }, { 2 }, { 3 }, { 4 } 
     }; 

が指定されるように、Zの最初の列を初期化し、ゼロで残りの部分を初期化宣言の例。

標準で同じ文章では、6.7.9と記載されています。21

は、既知のサイズのアレイを初期化するために使用 文字列リテラルの要素又は集合体のメンバー、またはより少ない文字がより括弧で囲まれたリスト少ないイニシャライザがある場合 が配列内の要素である場合、残りの集計は、 は、の静的記憶域 の継続時間がであるオブジェクトと同じ暗黙的に初期化されます。

そして、その標準のための規則は言及: - 6.7.9.10

自動記憶域期間を持つオブジェクトが明示的に 初期化されていない場合、その値は不定です。静的 またはスレッド貯蔵期間を持つオブジェクトが明示的に初期化されていない場合、その後:それはポインタ型を有する場合

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