C'est de toute façon une mauvaise pratique d'initialiser un tableau de caractères avec un littéral de chaîne.
L'auteur de ce commentaire ne le justifie jamais vraiment et je trouve la déclaration déconcertante.
En C (et vous l'avez étiqueté C), c'est à peu près la seule façon d' initialiser un tableau charavec une valeur de chaîne (l'initialisation est différente de l'attribution). Vous pouvez écrire soit
char string[] = "october";
ou
char string[8] = "october";
ou
char string[MAX_MONTH_LENGTH] = "october";
Dans le premier cas, la taille du tableau est prise à partir de la taille de l'initialiseur. Les littéraux de chaîne sont stockés en tant que tableaux de char0 octet de fin; la taille du tableau est donc 8 ('o', 'c', 't', 'o', 'b', 'e', 'r', 0) Dans les deux autres cas, la taille du tableau est spécifiée dans la déclaration (8 et MAX_MONTH_LENGTHquoi que ce soit).
Ce que vous ne pouvez pas faire, c'est écrire quelque chose comme
char string[];
string = "october";
ou
char string[8];
string = "october";
etc. Dans le premier cas, la déclaration de stringest incomplète car aucune taille de tableau n'a été spécifiée et aucun initialiseur à prendre la taille. Dans les deux cas, =cela ne fonctionnera pas car a) une expression de tableau telle que stringpouvant ne pas être la cible d'une affectation et b) l' =opérateur n'est pas défini pour copier le contenu d'un tableau dans un autre.
De même, vous ne pouvez pas écrire
char string[] = foo;
où fooest un autre tableau de char. Cette forme d'initialisation ne fonctionnera qu'avec les littéraux de chaîne.
MODIFIER
Je devrais modifier cela pour dire que vous pouvez également initialiser des tableaux pour contenir une chaîne avec un initialiseur de type tableau, comme
char string[] = {'o', 'c', 't', 'o', 'b', 'e', 'r', 0};
ou
char string[] = {111, 99, 116, 111, 98, 101, 114, 0}; // assumes ASCII
mais il est plus facile pour les yeux d'utiliser des littéraux de chaîne.
EDIT 2
Pour affecter le contenu d'un tableau en dehors d'une déclaration, vous devez utiliser soit strcpy/strncpy(pour les chaînes terminées par 0), soit memcpy(pour tout autre type de tableau):
if (sizeof string > strlen("october"))
strcpy(string, "october");
ou
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!