20

関連しますが、C++について説明しているため、完全には重複していません:
静的配列のサイズに変数を与えることはできますか

次のように、子ファイルの 1 つで配列を定義しています。

static int arr[siz];

これsizは、子ファイルで使用できるグローバル変数です。しかし、gcc コンパイラは次のエラーを生成します。

<filename>: <line_num> : error : storage size of ‘arr’ isn’t constant

static可変サイズの配列を定義できないのはなぜですか?

編集:これはタイプのみの問題のようstatic intです。変数の型をarrからstatic intに変更するintと、配列のサイズがまだ変数に依存していても、エラーはなくなりますsiz

4

4 に答える 4

18

宣言する配列のサイズは一定ではないため、可変長配列 (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 が許可されていないという制限staticexternストレージ仕様が明確に言及されています。static明らかに、キーワードを削除すると、グローバル ストレージ仕様の VLA を持つことができます。

于 2012-05-20T18:04:55.400 に答える
5

コンパイル時に配列を割り当てるため、コンパイラは配列のサイズを事前に知る必要があります。を宣言するsiz前に、定数式として宣言する必要がarrあります。たとえば、次のようになります。

#define siz 5

また

enum ESizes
{
    siz = 5
};

または、実行時にサイズを決定する必要がある場合は、次を使用してヒープに割り当てることができますmalloc

static int* arr;
arr = (int*)malloc(siz * sizeof(int))

編集: eddieantonio が述べたように、私の答えは C89 に対して有効です。C99 では、可変サイズの配列を宣言できます。

于 2012-05-20T17:09:21.767 に答える
2

可変サイズの配列を定義することはできません。これarr[siz]は、コンパイラ (!) が配列にメモリを割り当てるためです (まあ、コンパイラはプログラムを作成しますが、詳細には立ち入らないでください)。ただし、変数は実行時に変更される可能性があります (!)。これは、コンパイラが割り当てるメモリ量を知る機会がないことを意味します。

あなたができることは

static int* arr;
arr = (int*) calloc(siz,sizeof(int))

これらの行により、実行時にメモリを割り当てるプログラムが作成されるため、正確なサイズも実行時に定義される場合があります。

于 2012-05-20T17:14:17.110 に答える
0

可変サイズの配列を宣言することはできませんstatic。そのスペースはデータ セグメント(初期化されていない変数の場合はbss セグメント) に割り当てられるためです。したがって、コンパイラはコンパイル時にサイズを知る必要があり、サイズが定数でない場合は文句を言います。

これの根本的な理由は、データ セグメントのサイズが生成される実行可能ファイルのサイズに影響することです。これは明らかにコンパイル時に作成されるため、修正する必要があります。

于 2012-05-20T21:24:58.993 に答える