web-dev-qa-db-fra.com

C ++ Comment définissez-vous un tableau de pointeurs sur null dans une liste d'initialisation comme dans le cas?

Je suis conscient que vous ne pouvez pas utiliser une liste d'initialisation pour un tableau. Cependant, j'ai entendu parler de façons de définir un tableau de pointeurs sur NULL d'une manière similaire à une liste d'initialisation.

Je ne sais pas comment cela se fait. J'ai entendu qu'un pointeur est défini sur NULL par défaut, bien que je ne sais pas si cela est garanti/dans la norme C++. Je ne sais pas non plus si l'initialisation via le nouvel opérateur par rapport à l'allocation normale peut également faire la différence.

Edit: Je veux faire cela dans une liste d'initialisation de fichier d'en-tête/constructeur. Je ne veux pas le mettre dans le constructeur, et je ne veux pas utiliser de vecteur.

30
user233320

Afin de définir un tableau de pointeurs sur null dans la liste d'initialisation du constructeur, vous pouvez utiliser le () initialiseur

struct S {
  int *a[100];

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

Malheureusement, dans la version actuelle de la langue, le () initializer est le seul initialiseur que vous pouvez utiliser avec un membre du tableau dans la liste d'initialisation du constructeur. Mais apparemment, c'est ce dont vous avez besoin dans votre cas.

Le () a le même effet sur les tableaux alloués avec new[]

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

Dans d'autres contextes, vous pouvez utiliser le {} initialiseur d'agrégat pour obtenir le même effet

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

Notez qu'il n'est absolument pas nécessaire de presser un 0 ou NULL entre les {}. La paire vide de {} fera très bien l'affaire.

37
AnT

Vous pouvez passer du tableau à std::vector et utilise

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

Les valeurs seront initialisées automatiquement par NULLs. Il s'agit de la méthode C++ préférée.


Mise à jour: depuis C++ 11, il existe un autre moyen: utiliser

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

Cela se comporte plus comme une version corrigée d'un tableau de style C (en particulier, évite les allocations dynamiques), transporte sa taille et ne se décompose pas en un pointeur. Cependant, la taille doit être connue au moment de la compilation.

6
Vlad

Normalement, un tableau ne sera pas initialisé par défaut, mais si vous initialisez explicitement un ou plusieurs éléments, tous les éléments restants seront automatiquement initialisés à 0. Puisque 0 et NULL sont équivalents, vous pouvez donc initialiser un tableau de pointeurs vers NULL comme ceci:

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

Je ne sais pas comment cela se fait. J'ai entendu qu'un pointeur est défini sur NULL par défaut, bien que je ne sais pas si cela est garanti/dans la norme C++.
Il n'est pas garanti par la norme C++. Les types intégrés (comme les pointeurs) sont remplis d'ordures sauf indication contraire.

Je ne sais pas non plus si l'initialisation via le nouvel opérateur par rapport à l'allocation normale peut aussi faire la différence.
Qu'entendez-vous par "allocation normale"? Si vous parlez d'une variable automatique, vous pouvez le faire:

MyType * pointers[2] = {}

et les pointeurs doivent être initialisés à NULL.

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