¿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++
c
compiler-construction
Namratha Patil
fuente
fuente
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:
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
fuente
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.
fuente
Si su compilador es GCC, también puede usar la siguiente sintaxis:
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 .
fuente
Depende de dónde coloque esta inicialización.
Si la matriz es estática como en
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.
En este caso, en cada llamada de la función foo tendrá un memset oculto.
El código anterior es equivalente a
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
entonces es técnicamente el mismo caso que el primero.
fuente