#include<iostream>
using namespace std;
main()
{
int m;
cin>>m;
int re[m];
cout<<sizeof(re);
}
このコードは、codeforces GNU C++ 4.7 で完全に実行されます (ただし、私の Microsoft Visual C++ では実行されません)。しかし、なぜ?配列のサイズは定数であるべきではありませんか?
あなたが言及したように、C++ 配列のサイズは定数式でなければなりません。
- VS を使用すると、以下が得られます。 error C2057: expected constant expression
- GCC には標準に対する拡張機能があり、コードをコンパイルできます。
可変長配列は C99 で導入されました。標準 C++ ではサポートされていませんが、GCC では拡張機能としてサポートされています。
詳細については、GCC 拡張: 可変長の配列を参照してください。
スタック割り当ての場合、コンパイル時に配列サイズを決定する必要があります。ただし、配列のサイズは実行時に決定されるため、ヒープに配置する必要があります。
使用する
int *re = new int[m];
cout << m << endl;
delete[] re;
他の人がすでに述べたように、可変長配列があるため、コードは非標準の C++ です。
int m;
cin>>m;
int re[m]; // m is not a compile time constant!
GCC ではこれを言語拡張として許可しています。を有効にすると、警告が表示されます-Wvla
。Afaik、gcc で aus などの特定の c++ 標準を使用するように強制すると、このコードは拒否されます-std=c++11
。
代わりにこれを行うことができます(ポール・ドレイパーがすでに書いているように)
int *re = new int[m]; // dynamic array allocation
delete[] re; // giving the memory back to the operating system
ただし、C++ には、このための使いやすいラッパーが用意されています。
std::vector<int> re(m);
ほとんどの場合、vector は動的に割り当てられた配列と同じように動作しますが、誤ってdelete
または doubledelete
を忘れるのを防ぎ、データを関数に渡すのが少し簡単になります。ベクターの詳細については、cppreference.comを参照してください。