動的割り当てなしの実行時に配列のサイズが許可されていますか?
-
09-09-2019 - |
質問
私は数年前から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
せずに、実行時に決定することができますか?
ただ、ダブルチェックに、私は私にいくつかの、すべての類似したコードをGoogleで検索しましストレージサイズエラーを与えると主張されます。
Pをプログラムする方法であってもDeitelのC ++。一般的なプログラミングエラー4.5の下で261の状態:
のみ定数自動および静的配列のサイズを宣言するために使用することができる。
ENLIGHTくれます。
解決
これは、C99で有効です。
C99標準では、スタックに可変サイズの配列をサポートしています。おそらく、あなたのコンパイラは、あまりにもこの構文をサポートすることを選択しました。
これはmalloc
とnew
は異なることに注意してください。 gcc
はそれだけスタックポインタを調整することにより、int array[100]
でないと同じように、スタック上の配列を割り当てます。いいえヒープ割り当ては行われません。これは _alloca
のような非常に多くのです。
他のヒント
これはのVLA(可変長配列)として知られています。これは、C99で標準ですが、GCCは拡張子としてC ++のコードでそれを可能にします。あなたはそれがコードを拒否したい場合は、-std=standard
、-ansi
と-pedantic
オプションを試してみてください。
これは、唯一のC99で有効のです。次回は、あなたが信頼できるコンパイラをrel="noreferrer"> href="http://www.comeaucomputing.com/tryitout/"
これは、それが有効なC ++ではありません、有効なC99です。これは、二つの言語の間にはないいくつかの相違点の一つである。
あなたは、動的配列のサイズを与えることができ、あなたがのDev-CPPのコンパイラを使用している場合には、私はそれを試してみました そして何のエラーを得ていないが、ビジュアルC ++およびVisual Studioのコンパイラでそれは不可能です。 私は理由がDEV-C ++は初期化されていないintに正の数を割り当てていることだと思います 我々はそれに数を与えたときに、それは与えられたものに置き換えています。 おそらく他のコンパイラは初期化されていない変数にnullを与えます。
このコードは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;
}
可変長配列(のVLA)が最近承認されたC ++ 14標準でサポートされ、そして出版を待っている。