使用malloc动态创建字符串数组

Chr*_*ris 36 c arrays malloc

我正在尝试使用C创建一个字符串数组malloc.数组将保留的字符串数可以在运行时更改,但字符串的长度将始终保持一致.

我试过这个(见下文),但是遇到了麻烦,我们非常感谢任何正确方向的提示!

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

orderedIds = malloc(variableNumberOfElements * (ID_LEN + 1));
Run Code Online (Sandbox Code Playgroud)

最终我希望能够使用数组来执行此操作:

strcpy(orderedIds[0], string1);
strcpy(orderedIds[1], string2);
/* etc */
Run Code Online (Sandbox Code Playgroud)

MBy*_*ByD 58

你应该分配一个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...
Run Code Online (Sandbox Code Playgroud)

对我来说似乎是个好方法.虽然你执行了很多malloc,但是你明确地为特定字符串分配内存,你可以释放一块内存而不释放整个"字符串数组"

  • 您是否必须使用另一个 for 循环来释放您分配的内存? (2认同)

Oli*_*rth 6

鉴于您的字符串都是固定长度的(大概是在编译时?),您可以执行以下操作:

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

// Clear-up
free(orderedIds);
Run Code Online (Sandbox Code Playgroud)

一个更麻烦但更通用的解决方案是分配一个指针数组,并伪装初始化它们以指向原始支持数组的元素:

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);
Run Code Online (Sandbox Code Playgroud)


sah*_*haj 6

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]);
}
Run Code Online (Sandbox Code Playgroud)