Namespaces
Variants

Initialization

From cppreference.net

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 [ constant-expression ] o designadores de miembros de struct/union de la forma . identifier ; consulte inicialización de arrays y inicialización de structs .

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:

( type ) { initializer-list }
( type ) { } (desde C23)
(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 implícita

Si no se proporciona un inicializador:

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