web-dev-qa-db-ja.com

C ++どのようにイニシャライザリストでポインタの配列をnullに設定するのですか?

アレイにイニシャライザリストを使用できないことを承知しています。ただし、イニシャライザリストと同様の方法でポインタの配列をNULLに設定する方法を聞いたことがあります。

これがどのように行われるかはわかりません。ポインタがデフォルトでNULLに設定されていると聞いたことがありますが、これがC++標準で保証されているかどうかはわかりません。また、通常の割り当てと比較して、新しいオペレーターを介して初期化することが違いを生むかどうかもわかりません。

編集:ヘッダーファイル/コンストラクターの初期化リストでこれを行うことを意味します。コンストラクタに入れたくないし、Vectorを使いたくない。

30
user233320

コンストラクタ初期化子リストでポインタの配列をnullに設定するには、()初期化子を使用できます

struct S {
  int *a[100];

  S() : a() {
    // `a` contains null pointers 
  }
};

残念ながら、現在のバージョンの言語では、()初期化子が、コンストラクタ初期化子リストの配列メンバーで使用できる唯一の初期化子です。しかし、明らかにこれはあなたがあなたの場合に必要なものです。

()は、new[]で割り当てられた配列に同じ影響を与えます

int **a = new int*[100]();
// `a[i]` contain null pointers 

他のコンテキストでは、{}集約初期化子を使用して同じ効果を達成できます

int *a[100] = {};
// `a` contains null pointers 

0の間に{}またはNULLを詰め込む必要はまったくないことに注意してください。空の{}のペアで問題ありません。

37
AnT

配列からstd::vectorに切り替えて使用できます

std::vector<T*> v(SIZE);

値はNULLsによって自動的に初期化されます。これは、推奨されるC++の方法です。


更新:C++ 11以降、もう1つの方法があります。

std::array<T*, SIZE> array = {};

これは修正されたバージョンのCスタイル配列(特に、動的割り当てを回避する)のように動作し、そのサイズを保持し、ポインターまで減衰しません。ただし、サイズはコンパイル時にわかっている必要があります。

6
Vlad

通常、配列はデフォルトでは初期化されませんが、1つ以上の要素を明示的に初期化すると、残りの要素は自動的に0に初期化されます。0とNULLは同等であるため、ポインタの配列を初期化できますNULLは次のようになります:

float * foo[42] = { NULL }; // init array of pointers to NULL
4
Paul R

これがどのように行われるかはわかりません。ポインタがデフォルトでNULLに設定されていると聞きましたが、これがC++標準で保証されているかどうかはわかりません。
C++標準では保証されていません。組み込み型(ポインタのような)は、特に設定しない限り、ガベージで埋められます。

また、通常の割り当てと比較して新しい演算子を介して初期化することで違いが生じるかどうかもわかりません。
「通常の割り当て」とはどういう意味ですか?自動変数について話している場合、これを行うことができます:

MyType * pointers[2] = {}

ポインタはNULLに初期化する必要があります。

2
Billy ONeal
void* p[10] = { 0 };
0
Johan Kotlinski