Array [n] vs Array [10]-変数と実数で配列を初期化しています


90

コードに次の問題があります。

int n = 10;
double tenorData[n]   =   {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

次のエラーを返します。

error: variable-sized object 'tenorData' may not be initialized

使用はdouble tenorData[10]動作しますが。

誰もが理由を知っていますか?


4
言語を与えるのに役立ちます。C ++では、その形式の配列はコンパイル時定数サイズである必要があります。
OrangeAlmondSoap 2013

C ++、mingw32-g ++コンパイラでコードブロックを使用!
msmf14 2013

おかげで、ジャスティンと@AndrewVarnerin、それはそれを解決しました!intの前にconstを追加しました:const int n = 10; 解決しました!
msmf14 2013

回答:


188

C ++では、可変長配列は無効です。G ++ではこれを「拡張機能」として許可しているため(Cでは許可されているため)、G ++では(-pedanticC ++標準に従わなくても)次のことができます。

int n = 10;
double a[n]; // Legal in g++ (with extensions), illegal in proper C++

「可変長配列」(適切な可変長配列は許可されていないため、C ++では「動的サイズ配列」と呼ばれる方がよい)が必要な場合は、自分でメモリを動的に割り当てる必要があります。

int n = 10;
double* a = new double[n]; // Don't forget to delete [] a; when you're done!

または、さらに良いことに、標準のコンテナを使用します。

int n = 10;
std::vector<double> a(n); // Don't forget to #include <vector>

それでも適切な配列が必要な場合は、作成時に変数ではなく定数を使用できます。

const int n = 10;
double a[n]; // now valid, since n isn't a variable (it's a compile time constant)

同様に、C ++ 11の関数からサイズを取得する場合は、constexpr:を使用できます。

constexpr int n()
{
    return 10;
}

double a[n()]; // n() is a compile time constant expression

1
ありがとう、これは別の良い解決策です。最終的に本当に必要なのは、配列ではなくベクトルです。
msmf14 2013

1
@ msmf14:ええ、のような標準のコンテナvectorは非常に便利です。
Cornstalks 2013

「std :: vector <[someclass]> a(n);」を呼び出すと、ベクトルソリューションは各要素を初期化しますか?
ジャスティン

3
あまり割り当てない場合(スタックサイズに比べて小さい場合)、alloca(3)と新しい配置でスタックメモリを使用することをお勧めします。これにより、メモリの解放について心配する必要がなくなり、メモリの割り当てがはるかに高速になります。
holgac 2016

2
g ++がそれを許可することに言及するための+1。私はこのエラーを観察しなかったので、これが違いを説明しています。
gebbissimo 2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.