È comunque una cattiva pratica inizializzare un array di caratteri con una stringa letterale.
L'autore di quel commento non lo giustifica mai e trovo sconcertante l'affermazione.
In C (e l'hai etichettato come C), è praticamente l'unico modo per inizializzare un array char
con un valore stringa (l'inizializzazione è diversa dall'assegnazione). Puoi anche scrivere
char string[] = "october";
o
char string[8] = "october";
o
char string[MAX_MONTH_LENGTH] = "october";
Nel primo caso, la dimensione dell'array viene presa dalla dimensione dell'inizializzatore. I letterali di stringa sono memorizzati come matrici di char
con 0 byte di terminazione, quindi la dimensione della matrice è 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).
Quello che non puoi fare è scrivere qualcosa del genere
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 dell'array e non esiste un inizializzatore da cui prendere la dimensione. In entrambi i casi, =
non funzionerà perché a) un'espressione di array come string
potrebbe non essere la destinazione di un compito eb) l' =
operatore non è definito per copiare comunque i contenuti di un array su un altro.
Per lo stesso motivo, non puoi scrivere
char string[] = foo;
dov'è foo
un altro array di char
. Questa forma di inizializzazione funzionerà solo con valori letterali stringa.
MODIFICARE
Dovrei modificare questo per dire che puoi anche inizializzare le matrici per contenere una stringa con un inizializzatore in 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 letterali stringa.
MODIFICA 2
Per assegnare il contenuto di un array al di fuori di una dichiarazione, è necessario 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!