Інакше погана практика ініціалізувати масив char із рядковим літералом.
Автор цього коментаря ніколи насправді не виправдовує цього, і я вважаю це твердження дивним.
У 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
. Ця форма ініціалізації працюватиме лише з рядковими літералами.
EDIT
Я повинен змінити це, щоб сказати, що ви також можете ініціалізувати масиви, щоб утримувати рядок з ініціалізатором у стилі масиву, наприклад
char string[] = {'o', 'c', 't', 'o', 'b', 'e', 'r', 0};
або
char string[] = {111, 99, 116, 111, 98, 101, 114, 0}; // assumes ASCII
але на очах простіше використовувати рядкові букви.
EDIT 2
Щоб призначити вміст масиву поза декларацією, вам потрібно буде використовувати або strcpy/strncpy
(для рядків, що закінчуються 0), або 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!