Есть несколько способов создать массив строк в 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-й массив указателей на 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];
Объявляется как 2-элементный массив указателей на 14-элементные массивы char.
char (*a[2])[14]
: массив из двух указателей на массив из 14 символов.