4

C ++では、の配列を動的に割り当てる場合int、sの値はint未定義ですか、それとも0に初期化されていますか?

    int *array = new int[50];
4

9 に答える 9

8

用語は初期化されていません。ただし、アレイを初期化する方法によって異なります。あなたはそれを価値初期化することができます:

int *array = new int[50]();

値は0になります。

初期化されていないままにすると、値からの読み取りが未定義の動作になるため、そこにある値を知ることができません。

于 2012-09-23T14:35:46.033 に答える
6

配列の代わりにベクトルを使用すると、すべての要素に対して初期値0が得られます。

std::vector<int> v(50);

別のデフォルト値が必要な場合は、次のいずれかを指定できます。

std::vector<int> v(50, 42);

ベクトルの追加の利点は、基になる配列を手動で解放する必要がないことです。

于 2012-09-23T15:08:08.850 に答える
4

あなたの質問に答えるには..しかし、デフォルト値を設定する方法があります。試す:

int *arr = new int[SIZE]() ;

上記はC++標準ですが、すべてのコンパイラで機能するとは限りません。安全な方法は、ループを使用して、選択したデフォルト値に初期化することです。

for(int i=0; i < SIZE; i++)
{
  arr[i] = 1; //1 being my default value
}

編集:他の人がさらによく指摘しているように: memset

于 2012-09-23T14:36:10.807 に答える
2

それらは未定義になります。初期化する前にそれらの場所に何があったかに応じてゴミだけ

于 2012-09-23T14:34:15.760 に答える
2

あなたが書くなら

int *array = new int[50];

その場合、配列の値には何でも含めることができますが、

int *array = new int[50]();

次に、「デフォルトコンストラクタ」を呼び出し、すべてが0になります。

于 2012-09-23T14:41:59.123 に答える
0

C / C ++では、オブジェクトをメモリに割り当てるということは、単にそのオブジェクトに多数のメモリブロックを予約することを意味します。初期値は基本的にこれらのブロックに存在するものであり、ほとんどの場合ランダムな値です。

于 2012-09-23T14:35:13.957 に答える
0

多くの場合(特にデバッグビルドで)ゼロまたは初期化されていないメモリを示す他の事前定義された値(通常、ゼロが使用されていない場合はいくつかのHexSpeak値)に初期化される可能性がありますが、それはガベージであると想定する必要があります。

たとえば、http://www.nobugs.org/developer/win32/debug_crt_heap.html#tableを参照してください

于 2012-09-23T14:35:35.417 に答える
0

それらはより隣接しており、割り当て前に存在していたデータがすべて含まれています。

于 2012-09-23T14:34:02.993 に答える
0

標準では完全に定義されておらず、実際にはOSとコンパイラに依存しています。一部のコンパイラでは、OS が提供したものをそのまま使用し、一部の OS では 0 になり、他のものはガベージになり、他のものは別のものになります。または、コンパイラは、またはのmemset後に非表示を自動的に挿入できます。しかし、いずれにせよポイントは、決して価値に頼らないことです。たとえば、コンパイラの現在のバージョンが 0 になったとしても、それは将来のバージョンで変更される可能性があり、おそらく別のコンパイラでは当てはまらないでしょう。mallocnew

于 2012-09-23T14:51:36.187 に答える