2017-01-24 14 views
0

code link配列の初期化実行時に

#include <stdio.h> 

int main(void) { 
    // your code goes here 
    int a = 2; 
    int b = 3; 
    int c; 
    c = a + b; 
    int arr[c]; 
    arr[5] = 0; 
    printf("%d",arr[5]); 
    return 0; 
} 

出力は、それが実行時には、配列番号を取っていることをどのように0

のですか?それは新しい機能ですか?

+2

この機能は過去1世紀に「新しい」追加されましたか? –

+0

既に初期化していますか? printf( "%d"、arr [4])のようなものをやっていたならば。 –

答えて

1

この機能(可変長配列)は、C99に導入されました。しかし、現在のところ、これはまだコンパイラ依存の動作です。いくつかのコンパイラ(gccのような)がそれをサポートしています。いくつか(msvcのようなもの)はそうではありません。

コード内にBTW、arr[5]が範囲外です。最後の要素はarr[4]である必要があります。

+1

これは標準Cです。拡張子ではありません(マイクロソフトは非常に遅いのでコンパイラに依存しますがC99を実装しています) – StoryTeller

+0

@StoryTeller私はそれを認識していませんでした。私はあなたのコメントを参照してからいくつかの掘り出して、私の答えでリンクを更新しました。 :-) –

3

これは可変長配列です。それらはC標準の1999年の改訂版で導入されました。

悲しい彼らのサポートはゆっくりと行われ、2011年の改訂ではオプション機能になりました(ただし、まだ標準化されています)。

涼しく見えますが、彼らは大きな注意点があります。サイズが「大きすぎる」場合は、コールスタックをオーバーフローさせる可能性があります。したがって、それらを使用するときは注意が必要です。


一部のコンパイラベンダーは耐性であったので、それはそれをなだめるために、オプションを行いました。マイクロソフトはこの事例の完全なケーススタディです。

+0

それをオプションにする理由は、「彼らのためのサポートがゆっくり入ったから」であるからです。参考資料は? –

+0

@ P.P。 - それが私の気持ちです。コンパイラベンダーの中には耐性があるものもあったため、それを緩和するためにオプションにしました。マイクロソフトはこの事例の完全なケーススタディです。 – StoryTeller

-1

(静的/固定メモリ割り当て)に混同していない&(動的なメモリ割り当て)のコンセプト:)

は、あなたのコンセプト仲間私は明確にしましょう。

次の質問に関連

      C supports two type of array. 

1. 静的配列は - "コンパイル時" のメモリを割り当てられています。

2. ダイナミックアレイ - は「実行時間」にメモリが割り当てられます。

Ques。配列が静的か動的かを調べる方法は?

Ans。 配列の宣言構文: -

  int array_Name[size];  //size defines the size of block of memory for an array; 

だから、ポイントに来て - >

ポイント1.サイズは、アレイへのコンパイル時に与えられた場合、それは「スタティックメモリ割り当て」です。サイズは決して変更されないので、固定サイズメモリ割り当てとも呼ばれます。 CでのARRAYの制限です。

ex。 int arr[10]; //10 is size of arr which is staticly defined int brr[] = {1000, 2, 37, 755, 3}; //size is equal to the no. of values initilizes with.

ポイント2.コンパイル時に配列にサイズが指定されている場合、動的メモリ割り当てです。 これは、stdlib.hで定義されているmalloc()関数によって実現されます。

は今、そのは、あなたのコードの明確化です: - は

#include <stdio.h> 

    int main(void) { 
     // your code goes here 
     int a = 2; 
     int b = 3; 
     int c; 
     c = a + b;    //c is calculated at run time 
     int arr[c];   //Compilor awaiting for the value of c which is given at run time but, 
     arr[5] = 0;   //here arr is allocated the size of 5 at static(compile) time which is never be change further whether it is compile time in next statements or run time. 
     printf("%d",arr[5]); 
     return 0; 
    } 

ので、(サイズ5の)配列は、ARRで値0を保持している[5]。
他の配列インデックスにはまだガベージ値が表示されます。

あなたはこの問題を解決するには満足しているでしょう:)