¿Cómo rellena los valores el compilador char array[100] = {0};
? ¿Cuál es la magia detrás de esto?
Quería saber cómo se inicializa internamente el compilador.
¿Cómo rellena los valores el compilador char array[100] = {0};
? ¿Cuál es la magia detrás de esto?
Quería saber cómo se inicializa internamente el compilador.
Respuestas:
No es magia
El comportamiento de este código en C se describe en la sección 6.7.8.21 de la especificación C ( borrador en línea de la especificación C ): para los elementos que no tienen un valor especificado, el compilador inicializa los punteros a NULL y los tipos aritméticos a cero ( y aplica esto recursivamente a los agregados).
El comportamiento de este código en C ++ se describe en la sección 8.5.1.7 de la especificación C ++ ( borrador en línea de la especificación C ++ ): el compilador agrega-inicializa los elementos que no tienen un valor especificado.
Además, tenga en cuenta que en C ++ (pero no en C), puede usar una lista de inicializadores vacía, haciendo que el compilador agregue-inicialice todos los elementos de la matriz:
char array[100] = {};
En cuanto a qué tipo de código puede generar el compilador cuando hace esto, eche un vistazo a esta pregunta: ensamblaje extraño desde la inicialización de la matriz 0
La implementación depende de los desarrolladores del compilador.
Si su pregunta es "qué sucederá con dicha declaración", el compilador establecerá el primer elemento de la matriz en el valor que ha proporcionado (0) y todos los demás se establecerán en cero porque es un valor predeterminado para los elementos de la matriz omitidos.
Si su compilador es GCC, también puede usar la siguiente sintaxis:
int array[256] = {[0 ... 255] = 0};
Consulte http://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Designated-Inits.html#Designated-Inits , y tenga en cuenta que esta es una característica específica del compilador .
Depende de dónde coloque esta inicialización.
Si la matriz es estática como en
char array[100] = {0};
int main(void)
{
...
}
entonces es el compilador que reserva los 100 0 bytes en la división de datos del programa. En este caso, podría haber omitido el inicializador.
Si su matriz es automática, entonces es otra historia.
int foo(void)
{
char array[100] = {0};
...
}
En este caso, en cada llamada de la función foo tendrá un memset oculto.
El código anterior es equivalente a
int foo(void)
{
char array[100];
memset(array, 0, sizeof(array));
....
}
y si omite el inicializador, su matriz contendrá datos aleatorios (los datos de la pila).
Si su matriz local se declara estática como en
int foo(void)
{
static char array[100] = {0};
...
}
entonces es técnicamente el mismo caso que el primero.