77

私は数年間 C++ を使用しており、今日いくつかのコードを見ました。

int main(int argc, char **argv)
{
    size_t size;
    cin >> size;
    int array[size];
    for(size_t i = 0; i < size; i++)
    {
        array[i] = i;
        cout << i << endl;
    }

    return 0;
}

GCC の下でコンパイルされます。

またはなしで実行時にサイズを決定するにはどうすればよいですnewmalloc?

再確認するために、いくつかをグーグルで検索しましたが、私のものと同様のコードはすべて、ストレージサイズエラーを引き起こすと主張されています。

Deitel の C++ How To Program p. 一般的なプログラミング エラー 4.5 の 261 の状態:

自動配列と静的配列のサイズを宣言するために使用できるのは、定数のみです。

私を啓発してください。

4

8 に答える 8

72

これは C99 で有効です。

C99 標準は、スタック上の可変サイズの配列をサポートしています。おそらく、コンパイラもこの構成をサポートすることを選択しました。

mallocこれはおよび とは異なることに注意してくださいnew。スタックポインターを調整するだけgccで行うのと同じように、スタックに配列を割り当てます。int array[100]ヒープ割り当ては行われません。によく似てい_allocaます。

于 2009-04-10T10:22:48.543 に答える
26

これは、VLA (可変長配列) として知られています。これは c99 では標準ですが、gcc では拡張機能として c++ コードで使用できます。コードを拒否したい場合は-std=standard、 、-ansiおよび-pedanticオプションを試してみてください。

于 2009-04-10T11:00:25.473 に答える
7

C99 でのみ有効です。次回は、信頼できるコンパイラでコードをチェックしてみてください。

于 2009-04-10T10:29:50.850 に答える
4

有効な C99 ですが、有効な C++ ではありません。これは、2 つの言語の数少ない違いの 1 つです。

于 2009-04-10T10:33:33.197 に答える
1

このコードは GNU GCC コンパイラで実行されます。

#include<bits/stdc++.h>

int main(int argc, char **argv)

{
    size_t size;

   std:: cin >> size;

    int array[size];

    for(size_t i = 0; i < size; i++)

{

array[i] = i;

        std:: cout << i;

 }

    return 0;
}
于 2015-09-03T19:37:14.347 に答える
0

Dev-Cpp コンパイラを使用している場合は、配列に動的にサイズを指定できます。試してみましたがエラーは発生しませんでしたが、Visual C++ および Visual Studio コンパイラでは不可能です。その理由は、dev-c++ が初期化されていない int に正の数値を割り当て、数値を指定すると、指定された数値に置き換えられるためだと思います。しかし、おそらく他のコンパイラは、初期化されていない変数に null を与えます。

于 2013-03-05T07:05:07.170 に答える
0

私は最近、スタック割り当て配列が必要なシナリオに出くわしました。(これは v8 のラッパーであり、すべてのメソッド呼び出しで引数の配列が必要でした)。

std::vector はヒープ メモリ割り当てを行いますが、そのパフォーマンスは受け入れられません。

これが私の解決策です。テンプレートを使用してケースの配列を割り当てます。

template<size_t Argc>
static void call(...) {
    v8::Local<v8::Value> v8Args[Argc];

    // use v8Args
    ...
}

template<typename It>
static void callV8Function(size_t argc, It argvBegin, It argvEnd,) {
    // C++ don't have dynamic stack allocation (like C99 does)
    // try to avoid heap-allocation...
    if (argc <= 4) {
        return callV8FunctionOnStack<4>(...);
    } else if (argc <= 8) {
        return callV8FunctionOnStack<8>(...);
    } else if (argc <= 16) {
        return callV8FunctionOnStack<16>(...);
    } else if (argc <= 32) {
        return callV8FunctionOnStack< 32>(...);
    } else {
        std::vector<v8::Local<v8::Value>> v8Args(argc);
        // fallback to vector
   }
}

(そしてもちろん、サイズが 32 の配列を使用することもできますが、これはあまりエレガントではありません。)

于 2019-10-21T08:27:26.850 に答える
-1

可変長配列 (VLA) は C++14 標準でサポートされています。これは最近承認され、発行を待っています。

于 2014-10-13T14:38:02.990 に答える