Establecer una matriz a un valor

¿Hay una forma más fácil en C de establecer una matriz en un valor que usar un bucle for y establecer cada valor uno por uno?

Si está configurando la matriz en todos los 0, o si la matriz es una matriz de bytes, puede usar memset

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

Si necesita configurarlo en un valor distinto de 0 en unidades más grandes que un byte (por ejemplo, establecer una matriz de int s en 1), entonces no existe una función estándar para hacerlo, tendrá que escribir su propio bucle for para eso.

Puede configurarlo en el mismo valor, pero solo en 0

¿Cómo inicializar todos los miembros de una matriz al mismo valor?

Inicializa todos los elementos a 0 :

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

Hay una respuesta en esa página para gcc también.

Si se trata de una matriz de valores de bytes, o si desea establecer cada byte en un valor específico, puede usar 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. 

Otra posibilidad es crear una plantilla del tamaño correcto en el momento de la inicialización (ya sea una inicialización real como la que se muestra a continuación, o en una función de init ), luego llamar a memcpy para que la memcpy en la matriz real más adelante.

 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 estructuras con un valor precalculado fijo: inicialice una copia ficticia con los campos requeridos establecidos y luego memcpy en lugar de configurar manualmente todos los campos cada vez que desee una nueva instancia.


(a) Aparte: etimología de blat :

El archivo de jerga (vea el glosario para todas las definiciones) enumera blat como las cuatro variables metasintácticas {foo, bar, thud, blat} , o un sinónimo de blast , sense 1.

A su vez, blast (sense 1) se define como un sinónimo de BLT (que no es el sándwich), que “se refiere a cualquier operación grande de copia o movimiento de campo de bits”.

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

Esta es una pregunta antigua, pero aquí están mis dos centavos.

Supongo que la computadora tiene que iterar sobre todos y cada uno de los valores de una manera u otra. Entonces, ¿por qué no usar un bucle for dentro de una macro? De esta manera, su código no desordena y obtiene algo como una función.

Para matrices asignadas a la stack (con tamaño definido en tiempo de comstackción):

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

Para matrices asignadas al montón (iter es un puntero a la primera entrada de la matriz):

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