1. ホーム
  2. c++

[解決済み] 変数サイズのオブジェクトが初期化されないことがある c++

2022-01-28 06:14:14

質問

この質問は以前にもあったようですが、なぜ私の場合はうまくいかないのか理解できません。

void calc(vector<char> zodis1, vector<char> zodis2, vector<char> zodisAts,int zo1,int zo2,int zoA)
{
   int i,u=0;

   int zod1[zo1]=0;
   int zod2[zo2]=0;
   int zodA[zoA]=0; 
}

zod1, zod2, zoA の3つともエラーになる。 variable-sized object may not be initialized c++ しかし、コンパイラはその意味を知っているはずです。 zo 初期化する前に cout<<zo1; が動作し、その意味をプリントアウトします。

では、何が問題なのでしょうか?

解決方法は?

を宣言することができます。 array とだけ 定数 の大きさは、コンパイル時に推論することができます。 zo1 , zo2zoA は変数であり、その値は実行時にのみ知ることができる。

詳しく説明すると、スタック上にメモリを確保する場合、コンパイル時にサイズが分かっている必要があります。配列はメソッドにローカルなので、スタックに配置されます。定数値を使うか、あるいはメモリを ヒープ を使って new を使用し、終了時に再割り当てします。 delete のように

int* zod1 = new int[zo1];
//.... other code


delete[] zod1;

しかし vector の代わりに array ここでも vector はヒープ上のアロケーションの面倒を見ます。

余談ですが vector なぜなら、ベクター全体がコピーされて引数として渡され、呼び出し側では何の変化も見られないからです。使用方法 vector<char>& zodis1 の代わりに