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 char
avec 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 char
0 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_LENGTH
quoi 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 string
est 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 string
pouvant 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ù foo
est 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!