Initialization
Una declaración de un objeto puede proporcionar su valor inicial mediante el proceso conocido como inicialización .
Para cada declarador , el inicializador, si no se omite, puede ser uno de los siguientes:
=
expresión
|
(1) | ||||||||
=
{
lista-de-inicializadores
}
|
(2) | ||||||||
=
{
}
|
(3) | (desde C23) | |||||||
donde initializer-list es una lista no vacía separada por comas de initializer s (con una coma final opcional), donde cada initializer tiene una de tres formas posibles:
| expresión | (1) | ||||||||
{
lista-de-inicializadores
}
|
(2) | ||||||||
{
}
|
(3) | (desde C23) | |||||||
lista-de-designadores
=
inicializador
|
(4) | (desde C99) | |||||||
|
donde
designator-list
es una lista de designadores de array de la forma
Nota: además de inicializadores, las listas de inicialización entre llaves initializer-list pueden aparecer en literales compuestos , que son expresiones de la forma:
|
(desde C99) | ||||||||||||||||||||||||||||||||||||
Contenidos |
Explicación
El inicializador especifica el valor inicial almacenado en un objeto.
Inicialización explícita
Si se proporciona un inicializador, consulte
- 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.
Inicialización implícita
Si no se proporciona un inicializador:
- los objetos con duración de almacenamiento automática se inicializan con valores indeterminados (que pueden ser representaciones trampa )
- los objetos con duración de almacenamiento estática y local de hilo se inicializan vacíos
Inicialización vacía
|
Un objeto está inicializado-vacío si es explícitamente inicializado desde el inicializador = { } . |
(since C23) |
En algunos casos, un objeto se inicializa vacío si no se inicializa explícitamente, es decir:
- los punteros se inicializan a valores de puntero nulo de sus tipos
- los objetos de tipos integrales se inicializan a cero sin signo
- los objetos de tipos flotantes se inicializan a cero positivo
- todos los elementos de arrays, todos los miembros de structs, y los primeros miembros de unions se inicializan vacíos, recursivamente, además todos los bits de relleno se inicializan a cero
- (en plataformas donde los valores de puntero nulo y los ceros flotantes tienen representaciones de todos los bits en cero, esta forma de inicialización para estáticos normalmente se implementa asignándolos en la sección .bss de la imagen del programa)
Notas
Al inicializar un objeto de duración de almacenamiento estática o local al hilo, cada expresión en el inicializador debe ser una expresión constante o un literal de cadena .
Los inicializadores no pueden utilizarse en declaraciones de objetos de tipo incompleto, VLA y objetos de ámbito de bloque con vinculación.
Los valores iniciales de los parámetros de función se establecen como si fuera por asignación desde los argumentos de una llamada a función , en lugar de por inicialización.
Si un valor indeterminado se utiliza como argumento para cualquier llamada de la biblioteca estándar, el comportamiento es indefinido. De lo contrario, el resultado de cualquier expresión que involucre valores indeterminados es un valor indeterminado (por ejemplo, int n ; , n podría no compararse igual a sí mismo y podría parecer cambiar su valor en lecturas posteriores)
|
No existe una construcción especial en C que corresponda a value initialization en C++; sin embargo, = { 0 } (o ( T ) { 0 } en compound literals) (since C99) puede utilizarse en su lugar, ya que el estándar de C no permite structs vacíos, uniones vacías o arrays de longitud cero. |
(until C23) |
|
El inicializador vacío = { } (o ( T ) { } en compound literals) puede utilizarse para lograr la misma semántica que value initialization en C++. |
(since C23) |
Ejemplo
#include <stdlib.h> int a[2]; // inicializa a a {0, 0} int main(void) { int i; // inicializa i a un valor indeterminado static int j; // inicializa j a 0 int k = 1; // inicializa k a 1 // inicializa int x[3] a 1,3,5 // inicializa int* p a &x[0] int x[] = { 1, 3, 5 }, *p = x; // inicializa w (un array de dos structs) a // { { {1,0,0}, 0}, { {2,0,0}, 0} } struct {int a[3], b;} w[] = {[0].a = {1}, [1].a[0] = 2}; // una expresión de llamada a función puede usarse 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: VLA no puede ser inicializado // int vla[n] = {0}; }
Referencias
- Estándar C17 (ISO/IEC 9899:2018):
-
- 6.7.9 Inicialización (p: 100-105)
- Estándar C11 (ISO/IEC 9899:2011):
-
- 6.7.9 Inicialización (p: 139-144)
- Estándar C99 (ISO/IEC 9899:1999):
-
- 6.7.8 Inicialización (p: 125-130)
- Estándar C89/C90 (ISO/IEC 9899:1990):
-
- 6.5.7 Inicialización
Véase también
|
Documentación de C++
para
Inicialización
|