Динамически создавать массив строк с malloc
Я пытаюсь создать массив строк в C, используя malloc
. Количество строк, которые будет удерживать массив, может меняться во время выполнения, но длина строк всегда будет постоянной.
Я попытался это сделать (см. ниже), но у меня есть проблемы, любые советы в правильном направлении будут высоко оценены!
#define ID_LEN 5
char *orderedIds;
int i;
int variableNumberOfElements = 5; /* Hard coded here */
orderedIds = malloc(variableNumberOfElements * (ID_LEN + 1));
В конечном итоге я хочу использовать массив для этого:
strcpy(orderedIds[0], string1);
strcpy(orderedIds[1], string2);
/* etc */
Ответы
Ответ 1
Вам следует назначить массив указателей char, а затем для каждого указателя присвойте достаточно памяти для строки:
char **orderedIds;
orderedIds = malloc(variableNumberOfElements * sizeof(char*));
for (int i = 0; i < variableNumberOfElements; i++)
orderedIds[i] = malloc((ID_LEN+1) * sizeof(char)); // yeah, I know sizeof(char) is 1, but to make it clear...
Кажется хорошим способом для меня. Хотя вы выполняете много mallocs, вы четко назначаете память для определенной строки, и вы можете освободить один блок памяти, не освобождая весь "строковый массив"
Ответ 2
Учитывая, что ваши строки имеют фиксированную длину (предположительно во время компиляции?), вы можете сделать следующее:
char (*orderedIds)[ID_LEN+1]
= malloc(variableNumberOfElements * sizeof(*orderedIds));
// Clear-up
free(orderedIds);
Более громоздкое, но более общее решение состоит в том, чтобы назначить массив указателей и psuedo-инициализировать их для указания на элементы исходного массива:
char *raw = malloc(variableNumberOfElements * (ID_LEN + 1));
char **orderedIds = malloc(sizeof(*orderedIds) * variableNumberOfElements);
// Set each pointer to the start of its corresponding section of the raw buffer.
for (i = 0; i < variableNumberOfElements; i++)
{
orderedIds[i] = &raw[i * (ID_LEN+1)];
}
...
// Clear-up pointer array
free(orderedIds);
// Clear-up raw array
free(raw);
Ответ 3
char **orderIds;
orderIds = malloc(variableNumberOfElements * sizeof(char*));
for(int i = 0; i < variableNumberOfElements; i++) {
orderIds[i] = malloc((ID_LEN + 1) * sizeof(char));
strcpy(orderIds[i], your_string[i]);
}
Ответ 4
#define ID_LEN 5
char **orderedIds;
int i;
int variableNumberOfElements = 5; /* Hard coded here */
orderedIds = (char **)malloc(variableNumberOfElements * (ID_LEN + 1) * sizeof(char));
..