Inicialización
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
|
(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
- inicialización escalar para la inicialización de tipos escalares
- inicialización de arreglos para la inicialización de tipos de arreglos
- inicialización de estructuras para la inicialización de tipos de estructuras y uniones.
[editar] Inicialización Implicita
Si no se proporciona un inicializador:
- los objetos con duración de almacenamiento automática se inicializan a valores indeterminados (que pueden ser representaciones trampa)
- Los objetos con duración de almacenamiento estático y de hilo se inicializan como se indica a continuación
- 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
|