De todos modos, es una mala práctica inicializar una matriz de caracteres con un literal de cadena.
El autor de ese comentario nunca lo justifica realmente, y la declaración me parece desconcertante.
En C (y ha etiquetado esto como C), esa es prácticamente la única forma de inicializar una matriz char
con un valor de cadena (la inicialización es diferente de la asignación). Puedes escribir cualquiera
char string[] = "october";
o
char string[8] = "october";
o
char string[MAX_MONTH_LENGTH] = "october";
En el primer caso, el tamaño de la matriz se toma del tamaño del inicializador. Los literales de cadena se almacenan como matrices char
con un byte final de 0, por lo que el tamaño de la matriz es 8 ('o', 'c', 't', 'o', 'b', 'e', 'r', 0). En los segundos dos casos, el tamaño de la matriz se especifica como parte de la declaración (8 y MAX_MONTH_LENGTH
, lo que sea que sea).
Lo que no puedes hacer es escribir algo como
char string[];
string = "october";
o
char string[8];
string = "october";
En el primer caso, la declaración de string
está incompleta porque no se ha especificado un tamaño de matriz y no hay inicializador para tomar el tamaño. En ambos casos, =
no funcionará porque a) una expresión de matriz tal como string
puede no ser el objetivo de una asignación yb) el =
operador no está definido para copiar el contenido de una matriz a otra de todos modos.
Por esa misma razón, no puedes escribir
char string[] = foo;
donde foo
es otra matriz de char
. Esta forma de inicialización solo funcionará con literales de cadena.
EDITAR
Debo enmendar esto para decir que también puede inicializar matrices para contener una cadena con un inicializador de estilo de matriz, como
char string[] = {'o', 'c', 't', 'o', 'b', 'e', 'r', 0};
o
char string[] = {111, 99, 116, 111, 98, 101, 114, 0}; // assumes ASCII
pero es más fácil a la vista usar literales de cadena.
EDITAR 2
Para asignar el contenido de una matriz fuera de una declaración, necesitaría usar strcpy/strncpy
(para cadenas terminadas en 0) o memcpy
(para cualquier otro tipo de matriz):
if (sizeof string > strlen("october"))
strcpy(string, "october");
o
strncpy(string, "october", sizeof string); // only copies as many characters as will
// fit in the target buffer; 0 terminator
// may not be copied, but the buffer is
// uselessly completely zeroed if the
// string is shorter!