私はもう一度C++をいじくり回していて、クラスメンバーメソッド内またはmain()
関数内でポインターとして宣言されたときの配列の初期化に関する奇妙な動作に気づきました。
int * p = new int[20];
私が期待することは、ポインターがランダムな値で初期化されないままになることです。
int arr[20];
しかし、代わりにそれらはすべてゼロになります。何が起こっている?
私はもう一度C++をいじくり回していて、クラスメンバーメソッド内またはmain()
関数内でポインターとして宣言されたときの配列の初期化に関する奇妙な動作に気づきました。
int * p = new int[20];
私が期待することは、ポインターがランダムな値で初期化されないままになることです。
int arr[20];
しかし、代わりにそれらはすべてゼロになります。何が起こっている?
それらはゼロですが(これは大まかに言えば、以下を参照)、初期化されていません。
実際には、値を読み取ると未定義の動作に遭遇するため、ゼロであるとは言えません。初期化されていない変数を読み取ることはできません。
配列の値を初期化するには、次のようにします。
int * p = new int[20]();
// ^^
// note parenthesis
それ以外の場合は、初期化されません。
p
は整数へのポインタであり、new[]
式の結果で初期化されます。この式は、動的に割り当てられた整数の配列の最初の要素のアドレスを返します。配列自体は初期化されておらず、不確定な値が含まれています。もしあなたが言っていたらnew int[100]()
、代わりに配列はゼロで初期化されていたでしょう。