2010-11-01 17 views
14

C'è un modo più semplice in C per impostare un array su un valore rispetto all'utilizzo di un ciclo for e andando ad impostare ogni valore uno per uno?Impostazione di un array su un valore

+4

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

+1

A volte 'wmemset' può anche essere utile ..:-) –

risposta

17

Se si sta impostando la matrice a tutti i 0 del, o se la matrice è un array di byte, è possibile utilizzare memset

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

Se è necessario impostare un valore diverso da 0 a unità più grandi di un byte (ad esempio, imposta un array di int s su 1), quindi non esiste una funzione standard per farlo - dovrai scrivere il tuo loop per quello.

+1

Perché non sostituire numberOfElementsInMyArray con 'sizeof (myArray)/sizeof (myArray [0])' ;-) –

+0

Forse sono solo stupido, ma '1' si adatta a un byte. –

+3

@ Ben Jackson: Perché non funziona se 'myArray' è un puntatore a un array dinamico. –

3

Dipende dal valore. Se è zero, utilizzare memset(a, 0, sizeof(a)). Altrimenti, se si tratta di un array di caratteri, è possibile utilizzare memset con un altro valore. Ma memset funziona sempre a livello di char, quindi se il tuo array non è char solo zero probabilmente è significativo.

5

Se si tratta di una serie di valori di byte, o se si vuole impostare ogni byte ad un valore specifico, è possibile utilizzare 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. 

Un'altra possibilità è quella di creare un modello di dimensioni corrette al momento di inizializzazione (o inizializzazione reale come di seguito, o in una funzione init), quindi chiamare memcpy a blat (a) sull'array reale in un secondo momento.

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. 

Quest'ultimo metodo è utile anche per la compilazione di strutture con un valore pre-calcolata fisso: inizializzare una copia manichino con i campi obbligatori fissati poi memcpy invece di manualmente l'impostazione di tutti i campi ogni volta che si desidera una nuova istanza .


(a)parte: etimologia del blat:

Il Jargon file (si veda il glossario per tutte le definizioni) elenca blat sia come quattro metasyntactic variabile {foo, bar, thud, blat}, o un sinonimo di blast , senso 1.

A sua volta, blast (senso 1) è definito come un sinonimo di BLT (ovvero non il sandwich), che "si riferiva a qualsiasi operazione di copia o spostamento di grandi bit field".

+0

blat? Puoi fornire una citazione per quel termine? –

+0

Ufficialmente, no. È nel codice sorgente BSD per memcpy IIRC, generalmente utilizzato per un trasferimento di dati più grande del normale. Questo, e grok, sono le mie due parole preferite :-) – paxdiablo

+0

grok è davvero una parola eccellente. Ho trovato una definizione per esplosione in The Jargon File, che a sua volta è elencato come non comune, che elenca blat come una variazione. http://catb.org/jargon/oldversions/jarg231.txt –

Problemi correlati