ANSI C では、変数を宣言し、コードを実行して (長さが決定される)、追加の変数 (問題の配列など) を宣言できますか?
1999 年の標準では、ブロック内で宣言とコードを混在させることができます。それ以前は、ブロック内のすべての宣言はコードの前に置く必要がありました。C99 用にコンパイルするには、-std=c99
代わりに-ansi
( と同義-std=c89
) を使用します。したがって、以下は C99 では有効です。
int main(void)
{
int size;
// get the size somehow
int *array = malloc(sizeof *array * size);
...
// don't forget to clean up when you're done
free(array);
}
フラグを指定してコンパイルする必要がある場合-ansi
(つまり、C89 標準に準拠する必要がある場合)、次のようにコードを構成する必要があります。
int main(void)
{
int size;
int *array;
// get size somehow
array = malloc(sizeof *array * size);
...
free(array);
}
C99 は可変長配列もサポートしていることに注意してください。これにより、実行時に配列のサイズを指定できます。
int main(void)
{
int size;
// get size as before
int array[size];
...
}
VLA は、通常の配列に比べていくらか制限されており (構造体または共用体型のメンバーにすることはできず、関数の外に表示することもできません)、注意して使用する必要があります。多くのスペースを割り当てる必要がある場合は、malloc
代わりに使用してください。それらの実装は非常に複雑であることが判明したため、最近承認された 2011 年の標準では、実装にそれらをサポートし ないオプションが与えられています。