免責事項: 「宣言」と「定義」という 2 つの用語の違いに関しては、多くのあいまいさがあります。あいまいさを私とは異なる方法で解釈する場合は、違いを説明するために使用する例に注意してください。
完全を期すために:
可変長配列 ( VLA ) の宣言は、C99 では完全に有効です。
int n;
scanf( "%d", &n );
int arr[ n ];
...問題は、使用しているコンパイラまたは指定したフラグにある可能性があります。別の方法として、メモリ プールとmalloc
十分な大きさのメモリ ブロック ( n * sizeof( int )
)を使用し、使いfree
終わったらメモリ ブロックを使用する方法があります。
元のコードに戻ると、可変長配列の宣言のみが有効であり、定義は無効であることに注意することが非常に重要です。たとえば、可変長配列を宣言し、すべての要素をゼロで埋めたいとします。次のことができませんでした:
int n;
scanf( "%d", &n );
int arr[ n ] = { 0 }; // Invalid.
...あなたが定義しているようにarr
。次のことを行う必要があります。
int n;
scanf( "%d", &n );
int arr[ n ]; // Valid.
// Zero-fills the array.
for ( int i = 0; i < n; i++ ) {
arr[ i ] = 0;
}