1

次のコードが:でも実行される理由を教えてくださいstrict C-99 compiler

#include <stdio.h>
int main()
{
    int n;
    scanf("%d",&n);
    int a[n];
    a[1]=10;
    a[2]=5;
    printf("%d %d",a[1],a[2]);
}

変数宣言は、Cの他のステートメントの前に行う必要がありますか?動的に割り当てられた配列が必要な場合は、次のようなメモリ割り当て関数を使用する必要malloc()がありますが、整数を取得して入力し、そのサイズの配列を割り当てるのはなぜですか?

4

4 に答える 4

5

これは可変長配列と呼ばれ、C99標準でサポートされています。
これは、C89またはC++のどのバージョンでも機能しません。

于 2012-07-17T05:14:13.537 に答える
3

実際、このコードスニペットには、C90では許可されていないがC99では許可されている2つのメカニズムがあります。1つ目は、を使用した可変サイズ配列宣言a[n]です。2つ目は、宣言とコードの混合であり、コードa行の後に宣言されます。

DavidTribbleによるこのリストは便利だと思います。これはC++に焦点を当てていますが、C90とC99の違いについても概要を説明しています。

動的に割り当てられた配列が必要な場合は、malloc()などのメモリ割り当て関数を使用する必要があります。

どうやらあなたはすでに知っていますが、とにかく言及する価値があります:malloc()ヒープにメモリを割り当てるために使用されます。この例の配列は、別のメカニズムであるスタックに割り当てられます。違いの優れた説明については、この回答を参照してください。

于 2012-07-17T05:15:52.450 に答える
2

この機能は可変長配列と呼ばれ、具体的に質問に答えるために、C99標準で導入されました(おそらく一部のCコンパイラには以前に含まれていましたが、C99準拠のコンパイラには含まれている必要があります)。

あなたはそれらを使用しないことを推奨するたくさんのSOの答えを見つけるでしょう。を使用malloc()すると、メモリ割り当てが失敗するための定義済みのインターフェイスがあります。呼び出しはを返しますNULL。VLAには、そのようなインターフェイスはありません。割り当てが失敗したときに何が起こるかは未定義の動作です。

于 2012-07-17T05:15:09.007 に答える
1

C99では、例のように可変長配列を使用できます。

ここにそれについてのアーティクルがもっと説明しています

于 2012-07-17T05:17:12.227 に答える