Динамически создать массив строк с помощью malloc - PullRequest
33 голосов
/ 09 мая 2011

Я пытаюсь создать массив строк в 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 */

Ответы [ 4 ]

53 голосов
/ 09 мая 2011

Вы должны назначить массив указателей на символы, а затем для каждого указателя назначить достаточно памяти для строки:

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...

Мне кажется, это хороший способ.Хотя вы выполняете много malloc, вы четко выделяете память для конкретной строки и можете освободить один блок памяти, не освобождая весь «массив строк» ​​

6 голосов
/ 09 мая 2011

Учитывая, что все ваши строки имеют фиксированную длину (предположительно во время компиляции?), Вы можете сделать следующее:

char (*orderedIds)[ID_LEN+1]
    = malloc(variableNumberOfElements * sizeof(*orderedIds));

// Clear-up
free(orderedIds);

Более громоздкое, но более общее решение состоит в том, чтобы назначить массив указателей и инициализировать их псевдо, чтобы они указывали на элементы необработанного резервного массива:

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);
5 голосов
/ 09 мая 2011
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]);
}
0 голосов
/ 09 мая 2011

#define ID_LEN 5
char **orderedIds;
int i;
int variableNumberOfElements = 5; /* Hard coded here */

orderedIds = (char **)malloc(variableNumberOfElements * (ID_LEN + 1) * sizeof(char));

..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...