¿Cómo el compilador llena los valores en char array[100] = {0};
? ¿Cuál es la magia detrás de esto?¿cómo la matriz [100] = {0} establece toda la matriz en 0?
Quería saber cómo se inicializa internamente el compilador.
¿Cómo el compilador llena los valores en char array[100] = {0};
? ¿Cuál es la magia detrás de esto?¿cómo la matriz [100] = {0} establece toda la matriz en 0?
Quería saber cómo se inicializa internamente el compilador.
No es mágico. El comportamiento de este código en C se describe en la sección 6.7.8.21 de la especificación C (online draft of C spec): para los elementos que no tienen un valor específico, el compilador inicializa los punteros a NULL y los tipos aritméticos a cero (y recursivamente aplica esto 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++ (online draft of C++ spec): el compilador agrega: inicializa los elementos que no tienen un valor especificado.
Además, tenga en cuenta que en C++ (pero no C), se puede utilizar una lista de inicializador vacío, haciendo que el compilador para agregar a inicializar todos los elementos de la matriz:
char array[100] = {};
En cuanto a qué tipo de código que el compilador puede generar cuando se hace esto, echar un vistazo a esta pregunta: Strange assembly from array 0-initialization
La implementación corresponde a los desarrolladores del compilador.
Si su pregunta es "qué pasará con tal declaración", el compilador establecerá el primer elemento de matriz con el valor que proporcionó (0) y todos los demás se establecerán en cero porque es un valor predeterminado para matriz omitida elementos.
No tengo una fuente, pero estoy bastante seguro de que he leído en alguna parte que no hay un valor predeterminado para las declaraciones de matriz; obtienes la basura que ya estaba allí. No tiene sentido perder el tiempo configurando estos valores cuando es probable que los sobrescriba de todos modos. –
Ryan, si no establece un valor para el primer elemento que toda la matriz no está inicializada y contiene basura, pero si establece un valor para al menos un elemento de la misma, toda la matriz se inicializa para que los elementos no especificados se inicialicen implícitamente a 0. – qrdl
@qrdl tiene razón – mahesh
Si su compilador es GCC también puede utilizar la sintaxis siguiente:
int array[256] = {[0 ... 255] = 0};
Mire 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 del compilador específica.
¡Bienvenido! ya que usted solicitó Mirar más tipos de trucos, proporcioné – lakshmanaraj
. Sin duda puede hacerlo si lo desea, pero existen desventajas obvias al confiar en extensiones específicas del compilador como esta. –
@Dan Olson pregunta por sí mismo sobre el compilador específico y por lo tanto publicó esto. Si sientes que es inútil, lo eliminaré. – lakshmanaraj
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 se reserva a los 100 0 bytes en el segement 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 se omite el inicializador de su matriz contendrá datos aleatorios (los datos de la pila).
Si su matriz local se declara estático como en
int foo(void)
{
static char array[100] = {0};
...
}
entonces es técnicamente el mismo caso que el primero.
¿En C o en C++? Son dos preguntas separadas. –