Comment initialiser tous les membres d'un tableau à la même valeur ?

J'ai un grand tableau en C (pas en C++ si cela fait une différence). Je veux initialiser tous les membres à la même valeur. Je pourrais jurer que j'ai déjà connu un moyen simple de le faire. Je pourrais utiliser memset() dans mon cas, mais n'y a-t-il pas un moyen de le faire qui soit intégré dans la syntaxe C ?

Solution

À moins que cette valeur ne soit 0 (auquel cas vous pouvez omettre une partie de l'initialisateur et les éléments correspondants seront initialisés à 0), il n'y a pas de moyen simple.

Ne négligez pas la solution évidente, cependant :

int myArray[10] = { 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 };

Les éléments avec des valeurs manquantes seront initialisés à 0 :

int myArray[10] = { 1, 2 }; // initialize to 1,2,0,0,0...

Cela initialisera donc tous les éléments à 0 :

int myArray[10] = { 0 }; // all elements 0

En C++, une liste d'initialisation vide initialisera également tous les éléments à 0. Ceci n'est [pas autorisé] (https://stackoverflow.com/a/17589839) en C :

int myArray[10] = {}; // all elements 0 in C++

Rappelez-vous que les objets avec une durée de stockage statique seront initialisés à 0 si aucun initialisateur n'est spécifié :

static int myArray[10]; // all elements 0

Et que "0" ne signifie pas nécessairement "all-bits-zero", donc utiliser ce qui précède est meilleur et plus portable que memset(). meilleure et plus portable que memset(). (Les valeurs à virgule flottante seront initialisées à +0, les pointeurs à la valeur nulle, etc.)

Commentaires (17)

Vous pouvez utiliser l'initialisateur statique tel qu'il est décrit ci-dessus, mais cela peut être un vrai problème lorsque la taille de votre tableau change (lorsque votre tableau s'agrandit, si vous n'ajoutez pas les initialisateurs supplémentaires appropriés, vous obtenez des déchets).

memset vous donne un coup de temps d'exécution pour faire le travail, mais aucun coup de taille de code bien fait n'est immunisé contre les changements de taille de tableau. J'utiliserais cette solution dans presque tous les cas où le tableau est plus grand que, disons, quelques dizaines d'éléments.

S'il était vraiment important que le tableau soit déclaré statiquement, j'écrirais un programme pour écrire le programme à ma place et l'intégrer dans le processus de construction.

Commentaires (1)

Pour initialiser des types de données "normaux" (comme les tableaux d'int), vous pouvez utiliser la notation entre crochets, mais elle mettra à zéro les valeurs après la dernière s'il reste de la place dans le tableau :

// put values 1-8, then two zeroes
int list[10] = {1,2,3,4,5,6,7,8};
Commentaires (0)