8

なぜcでこれを行うことができますか?

int n;
scanf("%d",&n);
int a[n];

配列はロード時にメモリに配置されると思いましたが、上記の例は実行時に機能するようです。私は何か誤解していますか?あなたたちは助けることができますか?

ありがとう、

4

4 に答える 4

9

私は C の専門家ではありませんが、たとえば、これはC99によって追加され、 GCC によってサポートされている可変長配列である可能性があります。GCC は、関数から戻ったときに自動的に解放されるように、スタック上のそのような配列にメモリを割り当てます。

于 2009-12-08T05:44:29.013 に答える
7

可変長配列は C89 にはありませんが、C99 の新機能です。

于 2009-12-08T05:44:34.007 に答える
6

I thought array is *al*located memory during load time but seems like the above example works during run-time.

はい、<datatype> <Array_Name> [<size>]ロード時にメモリが割り当てられるような通常の配列は、C89 にあり、C99 にも存在します。

ただし、コード スニペットint a[n];では可変長配列または略して VLA です。C99 の VLA は、長さがコンパイル時の定数である必要がないことを除いて、他の配列と同じように定義されます。

VLA の必要性に関するまともな記事がここにあります: http://www.ddj.com/cpp/184401444 :)

于 2009-12-08T08:57:25.893 に答える
0

コードがどのように記述されているか (具体的には、ステートメントがある場合) を考えると、これは関数内のコードでなければなりません。

これが仕様で厳密に要求されているかどうかはわかりませんが、関数内では、すべての自動 (静的ではなく関数レベル) 配列がスタックに置かれます。そのため、通常の配列と VL 配列のどちらを使用しているかに関係なく、メモリは実行時に割り当てられます。

非自動配列のメモリは実行時に処理されないため、VLA はサポートされません。次のコードをコンパイルしようとすると:

extern int size;
char buff1[size];

void doit(int x)
{
    static int buff2[x];
    int buff3[x];
}

これをテストしたコンパイラ (gcc 4.2.1) では、次のエラーが発生しました。

moo.c:2: error: variably modified ‘buff1’ at file scope
moo.c: In function ‘doit’:
moo.c:6: error: storage size of ‘buff2’ isn’t constant
于 2009-12-08T07:25:19.537 に答える