2010-11-01 13 views
14

¿Existe alguna manera más fácil en C de establecer una matriz en un valor que utilizando un bucle for y estableciendo cada valor uno por uno?Configuración de una matriz con un valor

+4

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

+1

A veces 'wmemset' también puede ser útil.:-) –

Respuesta

17

Si va a configurar la matriz para todos de 0, o si la matriz es una matriz de bytes, puede utilizar memset

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

Si es necesario establecer a algo distinto de 0 en unidades más grandes que un byte (por ejemplo, establecer una matriz de int s a 1), entonces no hay una función estándar para hacer eso, tendrás que escribir tu propio bucle para eso.

+1

¿Por qué no sustituir numberOfElementsInMyArray con 'sizeof (myArray)/sizeof (myArray [0])' ;-) –

+0

Tal vez soy estúpido, pero '1' encaja en un byte. –

+3

@Ben Jackson: Porque eso no funciona si 'myArray' es un puntero a una matriz dinámica. –

3

Depende del valor. Si es cero, use memset(a, 0, sizeof(a)). De lo contrario, si se trata de una matriz de caracteres, puede usar memset con algún otro valor. Pero el memset siempre funciona en el nivel char, por lo que si tu array no es char, solo el cero es significativo.

5

Si se trata de un conjunto de valores de bytes, o si desea configurar cada byte a un valor específico, puede utilizar 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. 

Otra posibilidad es crear una plantilla del tamaño correcto en el momento de la inicialización (ya sea inicialización real como se indica a continuación, o en una función init), luego llame al memcpy a blat (a) en la matriz real en una fecha posterior.

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. 

Este último método también es útil para poblar las estructuras con un valor calculado previamente fijado: inicializar una copia maniquí con los campos obligatorios establecidos a continuación memcpy en vez de manualmente ajustar todos los campos cada vez que desee una nueva instancia .


(a)Aparte: etimología de blat:

El Jargon file (ver el glosario para todas las definiciones) enumera blat ya sea como los cuatro metasyntactic variable de {foo, bar, thud, blat}, o un sinónimo de blast , sentido 1.

A su vez, blast (sentido 1) se define como un sinónimo de BLT (es decir not el sándwich), que "se refería a cualquier operación de copia o movimiento de campo de bits grande".

+0

blat? ¿Puede proporcionar una cita para ese término? –

+0

Oficialmente, no. Está en el código fuente de BSD para memcpy IIRC, generalmente utilizado para una transferencia de datos más grande de lo normal. Eso, y grok, son mis dos palabras favoritas :-) – paxdiablo

+0

grok es una palabra excelente. Encontré una definición para explosión en The Jargon File, que a su vez aparece como poco común, que enumera blat como una variación. http://catb.org/jargon/oldversions/jarg231.txt –

Cuestiones relacionadas