Compartir vía


Inicialización de tipos de agregado

Un tipo de agregado es una estructura, unión o tipo de matriz. Si un tipo de agregado contiene miembros de tipos agregados, las reglas de inicialización se aplican de forma recursiva.

Sintaxis

initializer:
{ initializer-list } /* Para la inicialización de agregado */
{ initializer-list , }

initializer-list:
initializer
initializer-list , initializer

initializer-list es una lista de inicializadores separados por comas. Cada inicializador de la lista es una expresión constante o una lista de inicializadores. Por lo tanto, las listas de inicializadores se pueden anidar. Este formulario es útil para inicializar miembros agregados de un tipo de agregado, como se muestra en los ejemplos de esta sección. Sin embargo, si el inicializador de un identificador automático es una expresión única, no es necesario ser una expresión constante; simplemente debe tener el tipo adecuado para la asignación al identificador.

Para cada lista de inicializadores, los valores de las expresiones constantes se asignan, en orden, a los miembros correspondientes de la variable de agregado.

Si initializer-list tiene menos valores que un tipo de agregado, los miembros o elementos restantes del tipo de agregado se inicializan en 0. El valor inicial de un identificador automático no inicializado explícitamente no está definido. Si initializer-list tiene más valores que un tipo de agregado, se produce un error. Estas reglas se aplican a cada lista de inicializadores incrustados y al agregado en su conjunto.

El inicializador de una estructura es una expresión del mismo tipo o una lista de inicializadores para sus miembros entre llaves ({ }). Los miembros de campo de bits sin nombre no se inicializan.

Cuando se inicializa una unión, initializer-list debe ser una expresión constante única. El valor de la expresión constante se asigna al primer miembro de la unión.

Si una matriz tiene un tamaño desconocido, el número de inicializadores determina el tamaño de la matriz y su tipo se completa. No hay ninguna manera de especificar la repetición de un inicializador en C o para inicializar un elemento en medio de una matriz sin proporcionar también todos los valores anteriores. Si necesita esta operación en el programa, escriba la rutina en lenguaje de ensamblado.

El número de inicializadores puede establecer el tamaño de la matriz:

int x[ ] = { 0, 1, 2 }

Sin embargo, si especifica el tamaño y proporciona el número incorrecto de inicializadores, el compilador genera un error.

Específicos de Microsoft

El tamaño máximo de una matriz se define mediante size_t.

FIN Específico de Microsoft

Ejemplos

En este ejemplo se muestran inicializadores para una matriz.

int P[4][3] =
{
    { 1, 1, 1 },
    { 2, 2, 2 },
    { 3, 3, 3,},
    { 4, 4, 4,},
};

Esta instrucción declara P como una matriz de cuatro a tres e inicializa los elementos de su primera fila en 1, los elementos de su segunda fila a 2, etc., a través de la cuarta fila. La lista de inicializadores de las filas tercera y cuarta contiene comas después de la última expresión constante. La última lista de inicializadores ({4, 4, 4,},) también va seguida de una coma. Estas comas adicionales se permiten, pero no son necesarias. Solo se requieren comas que separan expresiones constantes entre sí y comas que separan una lista de inicializadores de otra.

Si un miembro agregado no tiene ninguna lista de inicializadores incrustados, se asignan valores, en orden, a cada miembro del subaggregate. Por lo tanto, la inicialización en el ejemplo anterior es equivalente al ejemplo siguiente:

int P[4][3] =
{
   1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4
};

Las llaves también pueden aparecer alrededor de inicializadores individuales de la lista y ayudarían a aclarar el ejemplo.

Al inicializar una variable de agregado, debe tener cuidado de usar las llaves y las listas de inicializadores correctamente. En el ejemplo siguiente se muestra la interpretación del compilador de llaves con más detalle:

typedef struct
{
    int n1, n2, n3;
} triplet;

triplet nlist[2][3] =
{
    { {  1, 2, 3 }, {  4, 5, 6 }, {  7, 8, 9 } },  /* Row 1 */
    { { 10,11,12 }, { 13,14,15 }, { 16,17,18 } }   /* Row 2 */
};

En este ejemplo, nlist se declara como una matriz de estructuras de 2 a 3, cada estructura que tiene tres miembros. La fila 1 de la inicialización asigna valores a la primera fila de nlist, como se indica a continuación:

  1. La primera llave izquierda de la fila 1 indica al compilador que la inicialización del primer miembro agregado de nlist (es decir, nlist[0]) comienza.

  2. La segunda llave izquierda indica que la inicialización del primer miembro agregado de nlist[0] (es decir, la estructura en nlist[0][0]) comienza.

  3. La primera llave derecha finaliza la inicialización de la estructura nlist[0][0]; la siguiente llave izquierda inicia la inicialización de nlist[0][1].

  4. El proceso continúa hasta el final de la línea, donde la llave de cierre finaliza la inicialización de nlist[0].

La fila 2 asigna valores a la segunda fila de nlist de forma similar. Se requieren los conjuntos externos de llaves que incluyan los inicializadores en las filas 1 y 2. La construcción siguiente, que omite las llaves externas, provocaría un error:

triplet nlist[2][3] =  /* THIS CAUSES AN ERROR */
{
     {  1, 2, 3 },{  4, 5, 6 },{  7, 8, 9 },   /* Line 1 */
     { 10,11,12 },{ 13,14,15 },{ 16,17,18 }    /* Line 2 */
};

En esta construcción, la primera llave izquierda de la línea 1 inicia la inicialización de nlist[0], que es una matriz de tres estructuras. Los valores 1, 2 y 3 se asignan a los tres miembros de la primera estructura. Cuando se encuentra la siguiente llave derecha (después del valor 3), se completa la inicialización de nlist[0] y las dos estructuras restantes de la matriz de tres estructuras se inicializan automáticamente en 0. De forma similar, { 4,5,6 } inicializa la primera estructura de la segunda fila de nlist. Las dos estructuras restantes de nlist[1] se establecen en 0. Cuando el compilador encuentra la siguiente lista de inicializadores ( { 7,8,9 } ), intenta inicializar nlist[2]. Dado que nlist solo tiene dos filas, este intento produce un error.

En este ejemplo siguiente, los tres int miembros de x se inicializan en 1, 2 y 3, respectivamente.

struct list
{
    int i, j, k;
    float m[2][3];
} x = {
        1,
        2,
        3,
       {4.0, 4.0, 4.0}
      };

En la list estructura, los tres elementos de la primera fila de m se inicializan en 4.0; los elementos de la fila restante de m se inicializan en 0,0 de forma predeterminada.

union
{
    char x[2][3];
    int i, j, k;
} y = { {
            {'1'},
            {'4'}
        }
      };

La variable yde unión , en este ejemplo, se inicializa. El primer elemento de la unión es una matriz, por lo que el inicializador es un inicializador agregado. La lista {'1'} de inicializadores asigna valores a la primera fila de la matriz. Puesto que solo aparece un valor en la lista, el elemento de la primera columna se inicializa con el carácter 1y los dos elementos restantes de la fila se inicializan en el valor 0 de forma predeterminada. Del mismo modo, el primer elemento de la segunda fila de x se inicializa con el carácter 4y los dos elementos restantes de la fila se inicializan en el valor 0.

Consulte también

Inicialización