2009-03-10 13 views

Respuesta

151

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

+0

¿Todos los compiladores de C hacen esto? Me hicieron creer que solo Visual Studio hace esto. – JFA

+1

borrador en línea de especificaciones de C++ roto, ¿alguien tiene un nuevo enlace? – bkarj

32

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.

+0

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. –

+10

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

+0

@qrdl tiene razón – mahesh

26

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.

+0

¡Bienvenido! ya que usted solicitó Mirar más tipos de trucos, proporcioné – lakshmanaraj

+1

. Sin duda puede hacerlo si lo desea, pero existen desventajas obvias al confiar en extensiones específicas del compilador como esta. –

+0

@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

16

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.

Cuestiones relacionadas