C ++では、の配列を動的に割り当てる場合int
、sの値はint
未定義ですか、それとも0に初期化されていますか?
int *array = new int[50];
用語は初期化されていません。ただし、アレイを初期化する方法によって異なります。あなたはそれを価値初期化することができます:
int *array = new int[50]();
値は0になります。
初期化されていないままにすると、値からの読み取りが未定義の動作になるため、そこにある値を知ることができません。
配列の代わりにベクトルを使用すると、すべての要素に対して初期値0が得られます。
std::vector<int> v(50);
別のデフォルト値が必要な場合は、次のいずれかを指定できます。
std::vector<int> v(50, 42);
ベクトルの追加の利点は、基になる配列を手動で解放する必要がないことです。
あなたの質問に答えるには..しかし、デフォルト値を設定する方法があります。試す:
int *arr = new int[SIZE]() ;
上記はC++標準ですが、すべてのコンパイラで機能するとは限りません。安全な方法は、ループを使用して、選択したデフォルト値に初期化することです。
for(int i=0; i < SIZE; i++)
{
arr[i] = 1; //1 being my default value
}
編集:他の人がさらによく指摘しているように: memset
それらは未定義になります。初期化する前にそれらの場所に何があったかに応じてゴミだけ
あなたが書くなら
int *array = new int[50];
その場合、配列の値には何でも含めることができますが、
int *array = new int[50]();
次に、「デフォルトコンストラクタ」を呼び出し、すべてが0になります。
C / C ++では、オブジェクトをメモリに割り当てるということは、単にそのオブジェクトに多数のメモリブロックを予約することを意味します。初期値は基本的にこれらのブロックに存在するものであり、ほとんどの場合ランダムな値です。
それらはより隣接しており、割り当て前に存在していたデータがすべて含まれています。
標準では完全に定義されておらず、実際にはOSとコンパイラに依存しています。一部のコンパイラでは、OS が提供したものをそのまま使用し、一部の OS では 0 になり、他のものはガベージになり、他のものは別のものになります。または、コンパイラは、またはのmemset
後に非表示を自動的に挿入できます。しかし、いずれにせよポイントは、決して価値に頼らないことです。たとえば、コンパイラの現在のバージョンが 0 になったとしても、それは将来のバージョンで変更される可能性があり、おそらく別のコンパイラでは当てはまらないでしょう。malloc
new