It's anyways bad practice to initialie a char array with a string literal.
L'autore di quel commento non lo giustifica davvero, e trovo la dichiarazione sconcertante.
In C (e lo hai etichettato come C), questo è praticamente l'unico modo per inizializzare un array di char
con un valore stringa (l'inizializzazione è diversa dall'assegnazione). Puoi scrivere
char string[] = "october";
o
char string[8] = "october";
o
char string[MAX_MONTH_LENGTH] = "october";
Nel primo caso, la dimensione dell'array è presa dalla dimensione dell'inizializzatore. I valori letterali stringa sono memorizzati come matrici di char
con un byte 0 di fine, quindi la dimensione dell'array è 8 ('o', 'c', 't', 'o', 'b', 'e', ' r ', 0). Nei secondi due casi, la dimensione dell'array viene specificata come parte della dichiarazione (8 e MAX_MONTH_LENGTH
, qualunque cosa accada).
Ciò che non puoi fare è scrivere qualcosa come
char string[];
string = "october";
o
char string[8];
string = "october";
ecc. Nel primo caso, la dichiarazione di string
è incompleta perché non è stata specificata alcuna dimensione di matrice e non c'è alcun inizializzatore da cui prendere la dimensione. In entrambi i casi, =
non funzionerà perché a) un'espressione di matrice come string
potrebbe non essere la destinazione di un'assegnazione eb) l'operatore =
non è definito per copiare il contenuto di una matrice ad un altro comunque.
Con lo stesso token, non puoi scrivere
char string[] = foo;
dove foo
è un'altra matrice di char
. Questa forma di inizializzazione funzionerà solo con stringhe letterali.
Modifica
Dovrei modificare questo per dire che puoi anche inizializzare gli array per contenere una stringa con un inizializzatore stile array, come
char string[] = {'o', 'c', 't', 'o', 'b', 'e', 'r', 0};
o
char string[] = {111, 99, 116, 111, 98, 101, 114, 0}; // assumes ASCII
ma è più facile per gli occhi usare stringhe letterali.
Modifica 2
Per assegnare i contenuti di un array all'esterno di una dichiarazione, devi utilizzare strcpy/strncpy
(per stringhe con terminazione 0) o memcpy
(per qualsiasi altro tipo di array):
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!