Définir un tableau à une valeur

Y at-il un moyen plus facile en C de définir un tableau à une valeur que d’utiliser une boucle for et de définir chaque valeur une par une?

Si vous définissez le tableau sur tous les 0 ou si le tableau est un tableau d’octets, vous pouvez utiliser memset

 // Set myArray to all 0's memset(myArray, 0, numberOfElementsInMyArray * sizeof(myArray[0])); 

Si vous devez définir une valeur autre que 0 dans des unités plus grandes qu’un octet (par exemple, définir un tableau d’ int ent sur 1), il n’y a pas de fonction standard pour le faire – vous devrez écrire votre propre boucle for pour ça.

Vous pouvez le définir sur la même valeur, mais uniquement sur 0

Comment initialiser tous les membres d’un tableau avec la même valeur?

initialiser tous les éléments à 0 :

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

Il y a une réponse dans cette page pour gcc également.

S’il s’agit d’un tableau de valeurs d’octet, ou si vous souhaitez définir chaque octet sur une valeur spécifique, vous pouvez utiliser memset :

 char xyzzy[100]; int plugh[40]; memset (xyzzy, 7, sizeof (xyzzy)); // all chars set to 7. memset (plugh, 0x42, sizeof (plugh)); // all integers set to (eg) 0x42424242. 

Une autre possibilité consiste à créer un modèle de taille correcte au moment de l’initialisation (initialisation réelle comme indiqué ci-dessous ou dans une fonction init ), puis d’appeler memcpy pour le blatter (a) ultérieurement sur le tableau réel.

 static int template[] = { 1, 1, 1, 1, 1 }; int zorkmid[3]; memcpy (zorkmid, template, sizeof (zorkmid)); // ensure template is at // least as big as zorkmid. 

Cette dernière méthode est également pratique pour remplir des structures avec une valeur pré-calculée fixe: initialisez une copie factice avec les champs obligatoires définis, puis memcpy -la au lieu de définir manuellement tous les champs à chaque nouvelle instance.


a) À côté: étymologie de blat :

Le fichier Jargon (voir le glossaire pour toutes les définitions) répertorie blat comme étant les quatre variables métasyntaxiques {foo, bar, thud, blat} ou un synonyme de blast , sens 1.

À son tour, blast (sens 1) est défini comme un synonyme de BLT (ce n’est pas le sandwich), qui “fait référence à toute opération de copie ou de déplacement dans un grand champ de bits”.

Dépend de la valeur. S’il vaut zéro, utilisez memset(a, 0, sizeof(a)) . Sinon, si c’est un tableau de caractères, vous pouvez utiliser memset avec une autre valeur. Mais memset fonctionne toujours au niveau des caractères. Par conséquent, si votre tableau n’est pas un caractère, seul zéro sera probablement significatif.

C’est une vieille question, mais voici mes deux centimes.

Je suppose que l’ordinateur doit parcourir chaque valeur d’une manière ou d’une autre. Alors pourquoi ne pas utiliser une boucle for dans une macro? De cette façon, votre code ne s’encombre pas et vous obtenez quelque chose comme une fonction.

Pour les tableaux alloués à la stack (avec une taille définie à la compilation):

 #define fill_array(array, value) \ for(int i; i < sizeof(array)/sizeof(array[0]); i++) \ {array[i]=value;} 

Pour les tableaux alloués aux segments de mémoire (iter est un pointeur sur la première entrée du tableau):

 #define fill_array(iter, lengt, value) \ for(int i; i < length; i++) \ {*iter=value; iter++;}