2010-11-01 6 views
14

Existe-t-il un moyen plus simple, dans C, de définir un tableau sur une valeur plutôt que d'utiliser une boucle for et de définir chaque valeur un par un?Définition d'un tableau à une valeur

+4

['memset'] (http://opengroup.org/onlinepubs/007908799/xsh/memset.html)? –

+1

Parfois, 'wmemset' peut aussi être utile.:-) –

Répondre

17

Si vous configurez le tableau à 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 avez besoin de le mettre à autre chose que 0 dans des unités plus grandes qu'un octet (par exemple, définir un tableau de int s à 1), alors il n'y a pas de fonction standard pour cela - vous devrez écrire votre propre boucle for pour cela.

+1

Pourquoi ne pas remplacer numberOfElementsInMyArray par 'sizeof (myArray)/sizeof (myArray [0])' ;-) –

+0

Peut-être que je suis juste stupide, mais '1' correspond à un octet. –

+3

@Ben Jackson: Parce que cela ne fonctionne pas si 'myArray' est un pointeur vers un tableau dynamique. –

3

Dépend de la valeur. Si c'est zéro, utilisez memset(a, 0, sizeof(a)). Sinon, si c'est un tableau char, vous pouvez utiliser memset avec une autre valeur. Mais memset fonctionne toujours au niveau char, donc si votre tableau n'est pas un char, seul zéro est susceptible d'être significatif.

5

Si c'est un tableau de valeurs d'octets, ou que vous voulez définir chaque octet à 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 (e.g.) 0x42424242. 

Une autre possibilité est de créer un modèle de la taille correcte au moment de l'initialisation (soit initialisation réelle comme ci-dessous, ou dans une fonction init), puis appelez memcpy à blat (a) sur le tableau réel à une date ultérieure.

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 le remplissage des structures avec une valeur précalculée fixe: initialiser une copie factice avec les champs obligatoires fixés alors memcpy au lieu de fixer manuellement tous les champs chaque fois que vous voulez une nouvelle instance .


(a)dehors: étymologique de blat:

Le Jargon file (voir le glossaire pour toutes les définitions) répertorie les blat que soit les quatre variables metasyntactic {foo, bar, thud, blat}, ou un synonyme de blast , sens 1.

À son tour, blast (sens 1) est défini comme un synonyme de BLT (c'est et non le sandwich), qui "se référait à toute opération de copie ou de déplacement sur un grand champ de bits".

+0

blat? Pouvez-vous fournir une citation pour ce terme? –

+0

Officiellement, non. C'est dans le code source de BSD pour memcpy IIRC, généralement utilisé pour un transfert de données plus grand que la normale. Cela, et grok, sont mes deux mots préférés :-) – paxdiablo

+0

grok est un mot le plus excellent en effet. J'ai trouvé une définition de blast dans le fichier de jargon, qui est lui-même répertorié comme rare, qui liste blat comme une variation. http://catb.org/jargon/oldversions/jarg231.txt –

Questions connexes