私は数年前から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の状態:
自動配列と静的配列のサイズを宣言するには、定数のみを使用できます。
教えて.
これはC99で有効です。
C99標準は、スタック上の可変サイズの配列をサポートします。おそらく、コンパイラもこの構成をサポートすることを選択しています。
これはmalloc
およびnew
とは異なることに注意してください。 gcc
は、スタックポインタを調整するだけでint array[100]
で行うように、スタックに配列を割り当てます。ヒープの割り当ては行われません。 _alloca
とほとんど同じです。
これはVLA(可変長配列)として知られています。 c99では標準ですが、gccではc ++コードで拡張機能として使用できます。コードを拒否したい場合は、-std=standard
、-ansi
および-pedantic
オプション。
C99でのみ 有効 です。次回、コードを 信頼性の高いコンパイラ でチェックしてみてください。
有効なC99であり、有効なC++ではありません。これは、2つの言語の数少ない違いの1つです。
このコードは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;
}
あなたがDev-Cppコンパイラを使用している場合、動的に配列にサイズを与えることができます。私はそれを試しましたがエラーはありませんでしたが、Visual C++およびVisual Studioコンパイラでは不可能です。その理由は、dev-c ++が初期化されていないintに正の数値を割り当て、それを指定すると、指定された値に置き換えられるためだと思います。しかし、おそらく他のコンパイラは初期化されていない変数にnullを与えます。