web-dev-qa-db-ja.com

動的割り当てなしの実行時の配列サイズは許可されますか?

私は数年前から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でコンパイルされました。

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

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

DeitelのC++プログラミング方法p。 Common Programming Error 4.5の下の261の状態:

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

教えて.

58
syaz

これはC99で有効です。

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

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

53
Mehrdad Afshari

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

19
jpalecek

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

7
Özgür

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

4
anon

このコードはGNU GCC Compilerで実行されます。

#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;
}
0
Dungeon

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

0
Najeeb