В любом случае, плохо инициализировать массив символов строковым литералом.
Автор этого комментария никогда не оправдывает его, и я нахожу это утверждение загадочным.
В C (и вы пометили это как C), это практически единственный способ инициализировать массив char
со строковым значением (инициализация отличается от присваивания). Вы можете написать либо
char string[] = "october";
или
char string[8] = "october";
или
char string[MAX_MONTH_LENGTH] = "october";
В первом случае размер массива берется из размера инициализатора. Строковые литералы хранятся в виде массивов char
с завершающим 0 байтом, поэтому размер массива равен 8 ('o', 'c', 't', 'o', 'b', 'e', 'r', 0). Во вторых двух случаях размер массива указывается как часть объявления (8 и MAX_MONTH_LENGTH
, что бы это ни было).
Что вы не можете сделать, это написать что-то вроде
char string[];
string = "october";
или
char string[8];
string = "october";
и т. д. В первом случае объявление string
является неполным, поскольку не указан размер массива и нет инициализатора, из которого можно получить размер. В обоих случаях =
не будет работать, потому что a) выражение массива, такое как, string
может не быть целью назначения и b) =
оператор не определен для копирования содержимого одного массива в другой в любом случае.
К тому же, вы не можете написать
char string[] = foo;
где foo
другой массив char
. Эта форма инициализации будет работать только со строковыми литералами.
РЕДАКТИРОВАТЬ
Я должен изменить это, чтобы сказать, что вы также можете инициализировать массивы для хранения строки с инициализатором в стиле массива, например
char string[] = {'o', 'c', 't', 'o', 'b', 'e', 'r', 0};
или
char string[] = {111, 99, 116, 111, 98, 101, 114, 0}; // assumes ASCII
но на глазах проще использовать строковые литералы.
РЕДАКТИРОВАТЬ 2
Чтобы назначить содержимое массива вне объявления, вам необходимо использовать либо strcpy/strncpy
(для строк с нулем в конце), либо memcpy
(для любого другого типа массива):
if (sizeof string > strlen("october"))
strcpy(string, "october");
или
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!