Espacios de nombres
Variantes
Acciones

Inicialización

De cppreference.com
< c‎ | language

Una declaración de un objeto puede tener un valor inicial a traves del proceso conocido como inicialización.


Para cada declarador, el inicializador, si no se omite, puede ser uno de los siguientes:

= expresión (1)
= { lista-inicializadora } (2)


donde la lista-inicializadora es una lista de inicializadores no vacios separados por coma, donde cada inicializador tiene tres posibles formas:

expresión (1)
{ lista-inicializadora } (2)
lista-designadores = inicializador (3) (desde C99)

donde la lista-designadores es una lista de arreglos designadores de [ expresión constante ] o [ un designadores miembro de estructura/union . identificador; véase inicialización de arreglos y inicialización de estructuras.


Nota: además de los inicializadores, los corchetes encerrados la lista-inicializadora pueden aparecer en literal compuestos, que son expresiones de la forma:

( tipo ) { lista-inicializadora }
(desde C99)

Contenido

[editar] Explicación

El inicializador especifica el valor inicial almacenado en un objeto.

[editar] Inicialización Explicita

Si se proporciona un inicializador, véase

[editar] Inicialización Implicita

Si no se proporciona un inicializador:

  • los punteros se inicializan a valores de puntero nulos de sus tipos
  • los objetos de tipos enteros se inicializan a cero sin signo
  • los objetos de tipos flotantes se inicializan a cero positivo
  • los miembros de arreglos, estructuras y uniones se inicializan como se describió anteriormente, recursivamente, más todos los bits de relleno se inicializan a cero
(en plataformas donde los punteros nulos y los ceros flotantes tienen representaciones de todos los bits-cero, esta forma de inicialización para la estática se implementa normalmente mediante su asignación en la sección .bss de la imagen del programa).

[editar] Observaciones

Cuando se inicializa un objeto de duración de almacenamiento estático o hilo, cada expresión en el inicializador debe ser una expresión constante o un literal de una cadena.

Los inicializadores no se pueden utilizar en declaraciones de objetos de tipo incompleto, arreglos de longitud variable y objetos de alcance de bloque con enlace.


Los valores iniciales de los parámetros de función se establecen como si se tratara de una asignación a partir de los argumentos de una llamada de función, en lugar de una inicialización.


Si se utiliza un valor indeterminado como argumento para cualquier llamada de la biblioteca estándar, el comportamiento es indefinido. De lo contrario, el resultado de cualquier expresión que implique valores indeterminados es un valor indeterminado (por ejemplo, int n;, n puede no compararse con él mismo y puede parecer que cambia su valor en lecturas posteriores).

[editar] Ejemplo

#include <stdlib.h>
int a[2]; // inicializa a en {0, 0}
int main(void)
{
    int i;          // inicializa i en un valor indeterminado
    static int j;   // inicializa j en 0
    int k = 1;      // inicializa k en 1
 
    // inicializa int x[3] en 1,3,5
    // inicializa int* p en &x[0]
    int x[] = { 1, 3, 5 }, *p = x;
 
    // inicializa w (un arreglo de dos estructuras) en
    // { { {1,0,0}, 0}, { {2,0,0}, 0} }
    struct {int a[3], b;} w[] = {[0].a = {1}, [1].a[0] = 2};
 
    // la expresión de llamada de función puede ser usada para una variable local
    char* ptr = malloc(10);
    free(ptr);
 
//  Error: los objetos con duración de almacenamiento estático requieren inicializadores constantes
 
//  static char* ptr = malloc(10);
 
//  Error: no se puede inicializar un arreglo de longitud variable
//  int vla[n] = {0};
}


[editar] Referencias

  • Standard C11 (ISO/IEC 9899:2011):
  • 6.7.9 Initialization (p: 139-144)
  • Standard C99 (ISO/IEC 9899:1999):
  • 6.7.8 Initialization (p: 125-130)
  • Standard C89/C90 (ISO/IEC 9899:1990):
  • 6.5.7 Initialization

[editar] Véase también

Documentación de C++ para Inicialización