Існує кілька способів створення масиву рядків у C. Якщо всі рядки будуть однакової довжини (або принаймні мають однакову максимальну довжину), ви просто оголосите двовимірний масив char та призначите за необхідності:
char strs[NUMBER_OF_STRINGS][STRING_LENGTH+1];
...
strcpy(strs[0], aString); // where aString is either an array or pointer to char
strcpy(strs[1], "foo");
Ви також можете додати список ініціалізаторів:
char strs[NUMBER_OF_STRINGS][STRING_LENGTH+1] = {"foo", "bar", "bletch", ...};
Це передбачає, що розмір і кількість рядків ініціалізатора збігаються з розмірами вашого масиву. У цьому випадку вміст кожного рядкового літералу (який сам по собі є нульовим завершеним масивом char) копіюється в пам'ять, виділену strs. Проблема такого підходу - можливість внутрішньої фрагментації; якщо у вас 99 рядків, що мають 5 символів або менше, але в 1 рядку довжиною 20 символів, 99 рядків матиме не менше 15 невикористаних символів; це марна трата місця.
Замість використання двовимірного масиву char, ви можете зберігати 1-d масив покажчиків на char:
char *strs[NUMBER_OF_STRINGS];
Зверніть увагу, що в цьому випадку ви виділили пам'ять лише для утримання покажчиків на рядки; пам'ять для самих рядків повинна бути розподілена в іншому місці (або як статичні масиви, або за допомогою malloc()
або calloc()
). Ви можете використовувати список ініціалізатора, як попередній приклад:
char *strs[NUMBER_OF_STRINGS] = {"foo", "bar", "bletch", ...};
Замість того, щоб копіювати вміст рядкових констант, ви просто зберігаєте покажчики на них. Зверніть увагу, що струнні константи можуть бути недоступними для запису; Ви можете перепризначити покажчик так:
strs[i] = "bar";
strs[i] = "foo";
Але ви, можливо, не зможете змінити вміст рядка; тобто
strs[i] = "bar";
strcpy(strs[i], "foo");
може не дозволено.
Ви можете використовувати malloc()
для динамічного розподілу буфера для кожного рядка та копіювати в цей буфер:
strs[i] = malloc(strlen("foo") + 1);
strcpy(strs[i], "foo");
До речі,
char (*a[2])[14];
Оголошує як двоелементний масив покажчиків на 14-елементні масиви char.
char (*a[2])[14]
це масив з двох покажчиків на масив з 14 символів.