2010-05-23 9 views
5

Digamos que tengo una matriz como¿Cómo inicializar una matriz a algo en C sin un bucle?

int arr[10][10]; 

Ahora quiero inicializar todos los elementos de esta matriz a 0. ¿Cómo puedo hacer esto sin bucles o especificando que cada elemento?

Tenga en cuenta que esta pregunta si para C

+0

Duplicado: http://stackoverflow.com/questions/201101/how-to-initialize-an-array-in-c – ptomato

Respuesta

11

La solución sucia rápida-n-:

int arr[10][10] = { 0 }; 

caso de que arranque cualquier elemento de la matriz, C-tomaría el valor inicializando cualquier elemento que no se especifica explícitamente. Entonces el código anterior inicializa el primer elemento a cero, y C establece todos los otros elementos a cero.

+1

Esto inicializará todos los elementos a 0? ¿Por qué dices que está sucio? – Laz

+9

Solo para aclarar: no "sigue el juego", * los obliga * a cero. Si escribes '= {1};' pondría el primer valor como 1, y el resto seguiría siendo cero. –

+1

Digo quick-n-dirty porque, aunque es lógicamente correcto y está garantizado que funciona, puede confundir a los mantenedores. Lo considero un atajo y evito usarlo a menos que la matriz o la estructura de datos sea demasiado grande para inicializar convenientemente cada elemento. –

1
int myArray[2][2] = {}; 

No es necesario que incluso escribir el cero de forma explícita.

+0

Ese es el tipo de matriz incorrecto, y un "cero" de aspecto extraño. –

+0

Sí, lo siento. Actualizado. –

+0

Creo que en C tienes que escribir el cero (las llaves vacías son, sin embargo, C++ válidas). – avakar

4
int arr[10][10] = {0}; // only in the case of 0 
5

Además de la sintaxis de inicialización, siempre se puede memset(arr, 0, sizeof(int)*10*10)

+0

Tenga en cuenta que esto todavía toma tiempo O (N) para N elementos. Por otro lado, es probablemente una O (N) más rápida que la que codifica a mano (o al menos no más despacio). – dmckee

+0

memset usa un bucle, por lo que no responde la pregunta. – SoapBox

+0

'memset' también podría ser incorrecto para punteros o matrices de coma flotante. –

3

Estás de suerte: con 0, que es posible.

memset(arr, 0, 10 * 10 * sizeof(int)); 

No se puede hacer esto con otro valor distinto a 0, porque memset obras en bytes, no en int s. Pero un int que es todos 0 bytes siempre tendrá el valor 0.

+1

También podría hacerlo con ~ 0 – geocar

+1

... inicializando todos los elementos a -1. Buen punto, no había pensado en eso. – Thomas

+0

Puede hacerlo con cualquier otro valor que, como bytes, conste del mismo valor en cada byte. 'n * (UINT_MAX + 1ULL)/255' es la familia de dichos valores (' n' = 0.1, ..., 'UCHAR_MAX'). –

0

int arr [10] [10] = {0};

Cuestiones relacionadas