Para inicializar una matriz int con todos ceros, necesito para usar:C Inicialización de matriz estática: ¿Cuán detallado debo ser?
int foo[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
O es que esto funciona:
int foo[10] = {0};
Para inicializar una matriz int con todos ceros, necesito para usar:C Inicialización de matriz estática: ¿Cuán detallado debo ser?
int foo[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
O es que esto funciona:
int foo[10] = {0};
int foo[10] = {0};
Esto es muy bien :)
Tenga en cuenta que si hace lo siguiente:
int foo[10] = {1};
Solo el primer elemento de la matriz se inicializará con un número distinto de cero, mientras que el resto se inicializará con ceros.
En C/C++ Si inicializa sólo el primer elemento de una matriz de tamaño conocido con un valor, el resto se llenará de cero, por lo que:
int foo[10] = {0};
va a hacer exactamente lo que quiere.
Esto también funciona para estructuras:
struct bar {
int x;
int y;
char c;
} myBar = {0};
inicializará todos los miembros a 0.
El estándar (C99 - 6.7.8/12 - Inicialización) dice esto:
Si hay menos inicializadores en una lista incluida en paréntesis que elementos o miembros de un agregado, o menos caracteres en un literal de cadena utilizado para inicializar una matriz de tamaño conocido que no hay elementos en la matriz, el restode r del agregado se inicializará implícitamente de la misma manera que los objetos que tienen una duración de almacenamiento estática.
En C, la gramática requiere que haya al menos una "expresión de asignación" dentro de los corchetes. Una 'expresión de asignación' puede ser muchas cosas, desde una constante o identificador hasta expresiones mucho más complejas. Sin embargo, una cadena vacía no califica como una 'expresión-asignación', por lo que tiene que haber algo entre llaves.
En C++, la gramática permite específicamente la '{}' inicializador, por lo que el siguiente sería también cero-inicializar la matriz:
int foo[10] = {};
Es probable que también vale la pena destacar que en C++ las entradas que no lo hacen tener un valor de inicializador específico en la lista de inicialización será 'inicializado en valor' o 'inicializado por defecto' que podría ser diferente de ser inicializado en cero dependiendo de lo que sean los constructores para el tipo de variable y si el compilador sigue el C + +98 estándar o el estándar C++ 03 (esta es probablemente la única diferencia de importancia entre C++ 98 y C++ 03). La situación completa con valor frente a la inicialización predeterminada es bastante complicada, por lo que si está interesado, consulte esta respuesta: Do the parentheses after the type name make a difference with new?.
Afortunadamente, la diferencia no parece causar muchos problemas en la práctica, aunque si se topa con ella, probablemente causaría algunos rasguños en la cabeza por un tiempo al tratar de averiguar cuál debería ser el comportamiento. Normalmente no pienso mucho sobre eso, me duele la cabeza.
De esa regla debe seguir que incluso int foo [10] = {}; es suficiente para una matriz de 10 ceros. – UncleBens
@UncleBens - en C la gramática requiere que haya al menos una 'expresión de asignación', que puede ser muchas cosas desde una constante o identificador hasta una expresión más compleja. Sin embargo, una cadena vacía no califica como una 'expresión-asignación', por lo que tiene que haber algo entre llaves. La gramática C++ permite específicamente el inicializador '{}'. –
@digitalross: esto está cubierto por el párrafo "Si hay menos inicializadores ... el resto del agregado se inicializará implícitamente de la misma manera que los objetos que tienen una duración de almacenamiento estática". –
todos los elementos no mencionados en el inicializador se inicializarán a ese tipo de valor cero cuando corresponda.
So int foo [10] = {0}; está bien, los elementos restantes no mencionados también serán 0
Guau, el tipo C parece ser simple, pero incluso después de años de citar la especificación, es sorprendente cómo puede aparecer algo nuevo.
Acabo de buscarlo en la primera edición de especificaciones (ANSI/ISO 9899-1990) y, por supuesto, el resto de un agregado automático se especifica (6.5.7) "Si hay menos ... inicializado implícitamente ... ".
So: Todo lo que no sea automático. Siempre 0 (o, como inicializado) ya sea inicializado o no. Automático: completamente inicializado si inicializa algún elemento, de lo contrario, no se inicializa.
@digitalross: Estás equivocado. Si deja a los lugareños completamente sin inicializar, no se inicializará. Si usa un inicializador e inicializa cualquiera de los campos, todos los campos se inicializarán. –
+1 para corregir su respuesta :) – AraK
¡Je, gracias! – DigitalRoss
@digitalross Si no inicializa un agregado automático, entonces sí debe contener basura. La pregunta es: ¿qué ocurre si inicializas un agregado con {0}? O bien es automático o no lo es. – AraK