なぜcでこれを行うことができますか?
int n;
scanf("%d",&n);
int a[n];
配列はロード時にメモリに配置されると思いましたが、上記の例は実行時に機能するようです。私は何か誤解していますか?あなたたちは助けることができますか?
ありがとう、
私は C の専門家ではありませんが、たとえば、これはC99によって追加され、 GCC によってサポートされている可変長配列である可能性があります。GCC は、関数から戻ったときに自動的に解放されるように、スタック上のそのような配列にメモリを割り当てます。
可変長配列は C89 にはありませんが、C99 の新機能です。
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 :)
コードがどのように記述されているか (具体的には、ステートメントがある場合) を考えると、これは関数内のコードでなければなりません。
これが仕様で厳密に要求されているかどうかはわかりませんが、関数内では、すべての自動 (静的ではなく関数レベル) 配列がスタックに置かれます。そのため、通常の配列と 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