2
#include<iostream>
using namespace std;
main()
{
  int m;
  cin>>m;
  int re[m];
  cout<<sizeof(re);
} 

このコードは、codeforces GNU C++ 4.7 で完全に実行されます (ただし、私の Microsoft Visual C++ では実行されません)。しかし、なぜ?配列のサイズは定数であるべきではありませんか?

4

4 に答える 4

5

あなたが言及したように、C++ 配列のサイズは定数式でなければなりません。
- VS を使用すると、以下が得られます。 error C2057: expected constant expression
- GCC には標準に対する拡張機能があり、コードをコンパイルできます。

于 2013-11-03T06:15:17.007 に答える
4

可変長配列は C99 で導入されました。標準 C++ ではサポートされていませんが、GCC では拡張機能としてサポートされています。

詳細については、GCC 拡張: 可変長の配列を参照してください。

于 2013-11-03T06:18:59.107 に答える
3

スタック割り当ての場合、コンパイル時に配列サイズを決定する必要があります。ただし、配列のサイズは実行時に決定されるため、ヒープに配置する必要があります。

使用する

int *re = new int[m];
cout << m << endl;
delete[] re;
于 2013-11-03T06:14:43.777 に答える
1

他の人がすでに述べたように、可変長配列があるため、コードは非標準の 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を参照してください。

于 2013-11-03T06:26:07.550 に答える