C++ Comment définissez-vous un tableau de pointeurs à null dans une liste d'initialiseurs de la façon suivante?

je suis conscient que vous ne pouvez pas utiliser une liste d'initialiseur pour un tableau. Cependant, j'ai entendu parler de façons dont vous pouvez définir un tableau de pointeurs à NULL d'une manière qui est similaire à une liste d'initialiseurs.

Je ne sais pas comment cela se fait. J'ai entendu dire qu'un pointeur est défini à NULL par défaut, mais je ne sais pas si c'est garanti/ dans le standard c++. Je ne suis pas sûr non plus si l'initialisation par le nouvel opérateur par rapport à l'allocation normale peut faire une différence trop.

Edit: je veux dire faire ceci 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 un Vecteur.

24
demandé sur user233320 2010-04-11 01:31:53

6 réponses

pour définir un tableau de pointeurs à nulls dans la liste des initialisateurs du constructeur, vous pouvez utiliser le () initialisation

struct S {
  int *a[100];

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

malheureusement, dans la version actuelle du langage le () initializer est le seul initialiseur que vous pouvez utiliser avec un membre de tableau dans la liste d'initialiseur de constructeur. Mais apparemment, c'est ce dont tu as besoin dans ton cas.

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

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

Dans d'autres contextes, vous pouvez utiliser le {} agrégation de l'initialiseur 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 et NULL entre le {}. La paire vide de {} fera l'amende juste.

32
répondu AnT 2017-07-15 09:18:05

vous pouvez passer du tableau à std::vector et utiliser

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

les valeurs seront initialisées par NULLs automatiquement. C'est la méthode C++ préférée.


mise à jour: depuis c++11, Il y a une autre façon: utiliser

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

cela se comporte plus comme une version corrigée du tableau c-style (en particulier, évite les attributions dynamiques), porte sa taille autour et ne se détériore pas à un pointeur. La taille, cependant, doit être connu à compiler temps.

6
répondu Vlad 2017-07-15 10:03:36

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

float * foo[42] = { NULL }; // init array of pointers to NULL
4
répondu Paul R 2015-10-15 18:43:36

Je ne sais pas comment cela se fait. J'ai entendu dire qu'un pointeur est défini à NULL par défaut, mais je ne sais pas si c'est garanti/ dans le standard c++.

Il n'est pas garanti par le standard c++. Les types intégrés ( comme les pointeurs ) sont remplis de déchets, sauf indication contraire.

Je ne suis pas sûr non plus si l'initialisation par le nouvel opérateur par rapport à l'allocation normale peut faire une différence aussi.

Que faites-vous dire par "répartition normale" ? Si vous parlez d'une variable automatique, alors vous pouvez faire ceci:

MyType * pointers[2] = {}

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

2
répondu Billy ONeal 2015-10-16 07:24:32
void* p[10] = { 0 };
0
répondu Johan Kotlinski 2010-04-10 21:35:45

si vous avez un tableau de membres alors il n'y a aucun moyen d'initialiser, à moins que ce soit un membre statique. Si le tableau n'est pas un membre statique, alors vous aurez à remplir à l'intérieur du corps du constructeur.

cela dit, il y a de fortes chances pour que vous utilisiez un std::vector. Autre que pour des raisons techniques telles que l'indisponibilité d'une STL standard pour votre plateforme, ou la performance légèrement inférieure a std::vector est meilleur qu'un tableau par tous les critères. Si la performance est la question assurez-vous que vous avez profilé et savoir par des nombres que c'est un problème.

-1
répondu wilhelmtell 2010-04-10 21:54:10