宣言する配列のサイズは一定ではないため、可変長配列 (VLA)になります。VLA は c99 標準で許可されていますが、それに関連するいくつかの制限があります。static
またはextern
ストレージ クラス指定子を含む可変長配列を使用することはできません。
ストレージ仕様の VLA がありますがstatic
、C99 標準では許可されていません。
参照:
c99 標準: 6.7.5.2/8
例 4 可変に変更された (VM) 型のすべての宣言は、ブロック スコープまたは関数プロトタイプ スコープのいずれかでなければなりません。static または extern ストレージ クラス指定子で宣言された配列オブジェクトは、可変長配列 (VLA) 型を持つことはできません。ただし、静的ストレージ クラス指定子で宣言されたオブジェクトは、VM 型 (つまり、VLA 型へのポインター) を持つことができます。最後に、VM 型で宣言されたすべての識別子は通常の識別子である必要があるため、構造体または共用体のメンバーにすることはできません。
したがって、static
ストレージ指定子を使用して動的サイズの配列が必要な場合は、ヒープに割り当てられた動的配列を使用する必要があります。
#define MAX_SIZE 256
static int* gArr;
gArr = malloc(MAX_SIZE * sizeof(int));
編集:
更新された質問に答えるには:宣言からキーワード
を削除するstatic
と、宣言された配列のストレージ指定子がstatic
グローバルに変更されます。上記の標準的な引用に注意してください。VLA が許可されていないという制限static
とextern
ストレージ仕様が明確に言及されています。static
明らかに、キーワードを削除すると、グローバル ストレージ仕様の VLA を持つことができます。