1

コマンドライン引数から特定の値を取得しようとしています。次に、この値を使用して、構造体内の整数配列のサイズを設定します。

私のコード:

int main( int argc, char* argv[])
{
    int size_of_heap = atoi(argv[1]);


    struct s_status
    {
        int block_size[size_of_heap];
        char status[size_of_heap];
    }; 

「可変長配列の宣言が無効です」というエラーが表示されます。

size_of_heap は、atoi() によって文字列から変換された後、整数になるはずなので、なぜ機能しないのかわかりません。

前もって感謝します

4

4 に答える 4

4

可変長配列はC99で導入されました。ANSI Cを超える標準をサポートするコンパイラを使用できない場合は、次のように構造体を宣言してください。

struct s_status {
    int *block_size;
    char *status;
}

malloc()実行時に構造体メンバーにメモリを割り当てるために使用します。

于 2012-11-11T19:34:21.870 に答える
2

GCCを使用していますか?はいの場合、GCCの-std=c99またはオプションを使用してC99モードでコンパイルできます。-std=gnu99デフォルトでは、GCCは可変長自動配列をサポートしない古いC89標準のみをサポートします。別のコンパイラを使用している場合は、C89ではなくC99をサポートする方法についてのドキュメントを確認してください。

「新しい」(今ではすでに古い)C99標準は13年前から存在しています。できる限り使用することをお勧めします。

于 2012-11-11T19:34:20.680 に答える
2

可変長配列サイズを許可しない C 標準 (またはコンパイラ) を使用しています。定数である必要があるか、代わりに と を使用しblock_sizestatus配列を作成する必要がありますmalloc(size_of_heap * sizeof(arr_datatype))

struct s_stats
{
    int *block_size;
    char *status;
};

struct s_stats my_stats;
my_stats.block_size = malloc(sizeof(int) * size_of_heap);
my_stats.status = malloc(size_of_heap); // sizeof(char) is always 1
于 2012-11-11T19:31:04.173 に答える
2

コンパイラは配列のサイズを知らないため、機能しません(size_of_heap実行時にのみ認識されます)。

実行時に必要なメモリを割り当てる必要があります。 を参照してくださいmalloc()

于 2012-11-11T19:32:14.127 に答える