Al inicializar un objeto de tipo matriz , el inicializador debe ser un literal de cadena (opcionalmente encerrado entre llaves) o ser una lista de llaves inicializadas para los miembros de la matriz:
= string_literal |
(1) | |
= { expresión , ... }
|
(2) | (hasta C99) (desde C99) |
1)Inicializador literal de cadenas para matrices de caracteres y caracteres anchos
2) lista separada por comas de expresiones constantes (hasta C99) que son inicializadores para elementos de matriz, opcionalmente utilizando designadores de matriz de la forma [
expresión-constante ]
=
(desde C99)
Se pueden inicializar conjuntos de tamaño conocido y conjuntos de tamaño desconocido,pero no VLA (desde el C99).
Todos los elementos de la matriz que no se inicializan explícitamente se inicializan implícitamente de la misma manera que los objetos que tienen una duración de almacenamiento estático.
Table of Contents
Inicialización desde las cuerdas
El literal de cadena (opcionalmente encerrado entre llaves) puede usarse como inicializador para una matriz de tipos coincidentes:
- Los literales de cadena ordinarios y los literales de cadena UTF-8 (desde C11) pueden inicializar matrices de cualquier tipo de caracteres (
char
,signed char
,unsigned char
) - Los literales de cadena ancha con prefijo L se pueden usar para inicializar matrices de cualquier tipo compatible con (ignorando las calificaciones de cv)
wchar_t
|
(desde C11) |
Los sucesivos bytes de la cadena literal o los caracteres anchos de la cadena literal ancha,incluido el byte/carácter nulo de terminación,inicializan los elementos de la matriz:
char str[] = "abc"; // str has type char[4] and holds 'a', 'b'. 'c', '\0'wchar_t wstr[4] = L"猫"; // str has type wchar_t[4] and holds L'猫', '\0', '\0', '\0'
Si se conoce el tamaño de la matriz,puede ser uno menos que el tamaño del literal de la cadena,en cuyo caso se ignora el carácter nulo de terminación:
char str[3] = "abc"; // str has type char[3] and holds 'a', 'b', 'c'
Tenga en cuenta que el contenido de dicha matriz es modificable, a diferencia de cuando se accede a un literal de cadena directamente con char* str = "abc";
.
Inicialización a partir de listas cerradas con corchetes
Cuando un conjunto se inicializa con una lista de inicializadores encerrada entre corchetes,el primer inicializador de la lista inicializa el elemento del conjunto con un índice cero (a menos que se especifique una designación)(desde C99),y cada inicializador subsiguiente sin designación (desde C99)inicializa el elemento del conjunto con un índice uno mayor que el inicializado por el inicializador anterior.
int x[] = {1,2,3}; // x has type int[3] and holds 1,2,3int y[5] = {1,2,3}; // y has type int[5] and holds 1,2,3,,int z[3] = {}; // z has type int[3] and holds all zeroes
Es un error proporcionar más inicializadores que elementos cuando se inicializa una matriz de tamaño conocido (excepto cuando se inicializan matrices de caracteres a partir de literales de cadena).
Un designador hace que el siguiente inicializador inicialice del elemento de la matriz descrito por el designador.La inicialización continúa luego en orden,comenzando con el siguiente elemento después del descrito por el designador. int n[5] = {[4]=5,[]=1,2,3,4} // holds 1,2,3,4,5 int a[MAX] = { // starts initializing a[] = 1, a[1] = 3, ... 1, 3, 5, 7, 9, [MAX-5] = 8, 6, 4, 2, 0}// for MAX=6, array holds 1,8,6,4,2,0// for MAX=13, array holds 1,3,5,7,9,0,0,0,8,6,4,2,0 ("sparse array") |
(desde C99) |
Cuando se inicializa una matriz de tamaño desconocido,el mayor subíndice para el que se especifica un inicializador determina el tamaño de la matriz que se declara.
Arrays anidados
Si los elementos de un conjunto son matrices,estructuras o uniones,los iniciadores correspondientes de la lista de iniciadores que figura entre corchetes son todos los iniciadores válidos para esos miembros,con la salvedad de que pueden omitirse sus corchetes como se indica a continuación:
Si el inicializador anidado comienza con una abrazadera de apertura,todo el inicializador anidado hasta su abrazadera de cierre inicializa el elemento correspondiente de la matriz:
int y[4][3] = { // array of 4 arrays of 3 ints each (4x3 matrix) { 1 }, // row initialized to {1, , } { , 1 }, // row 1 initialized to {, 1, } { [2]=1 }, // row 2 initialized to {, , 1}}; // row 3 initialized to {, , }
Si el inicializador anidado no comienza con una abrazadera de apertura,sólo se tienen en cuenta los inicializadores suficientes de la lista para los elementos o miembros del subconjunto,la estructura o la unión;los inicializadores restantes se dejan para inicializar el siguiente elemento del conjunto:
int y[4][3] = { 1, 3, 5, 2, 4, 6, 3, 5, 7 }; struct { int a[3], b; } w[] = { { 1 }, 2 };
Los designadores de arreglos pueden estar anidados;la expresión constante entre corchetes para arreglos anidados sigue la expresión constante entre corchetes para el arreglo exterior: int y[4][3] = {[][]=1, [1][1]=1, [2][0]=1}; // row 0 initialized to {1, 0, 0} // row 1 initialized to {0, 1, 0} // row 2 initialized to {1, 0, 0} // row 3 initialized to {0, 0, 0} |
(desde C99) |
Notes
El orden de evaluación de subexpresiones en un inicializador de matriz se secuencia indeterminadamente en C (pero no en C ++ desde c ++ 11):
int n = 1;int a[2] = {n++, n++}; puts((char[4]){'0'+n} + n++);
En la C,la lista de un inicializador no puede estar vacía.C++permite una lista vacía:
int a[3] = {}; int a[3] = {};
Al igual que con todas las demás inicializaciones , cada expresión en la lista de inicializadores debe ser una expresión constante al inicializar matrices de duración de almacenamiento estático o de hilo local :
static char* p[2] = {malloc(1), malloc(2)};
Ejemplo
int main(void){ short q1[4][3][2] = { { 1 }, { 2, 3 }, { 4, 5, 6 } }; short q2[4][3][2] = {1, , , , , , 2, 3, , , , , 4, 5, 6}; short q3[4][3][2] = { { { 1 }, }, { { 2, 3 }, }, { { 4, 5 }, { 6 }, } }; short q4[4][3][2] = {1, [1]=2, 3, [2]=4, 5, 6}; enum { RED, GREEN, BLUE }; const char *nm[] = { [RED] = "red", [GREEN] = "green", [BLUE] = "blue", };}
References
- Norma C11 (ISO/IEC 9899:2011):
- 6.7.9/12-38 Inicialización (p:140-144)
- Norma C99 (ISO/IEC 9899:1999):
- 6.7.8/12-38 Inicialización (p:126-130)
- Norma C89/C90 (ISO/IEC 9899:1990):
- 6.5.7 Inicialización
© cppreference.com
Licenciado bajo la Creative Commons Attribution-ShareAlike Unported License v3.0.
http://en.cppreference.com/w/c/language/array_initialization