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

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

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

 #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 */ 

你应该分配一个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... 

对我来说似乎是个好方法。 虽然您执行了许多malloc,但是您可以清楚地为特定字符串分配内存,并且可以释放一块内存而无需释放整个“字符串数组”

 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]); } 

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

 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); 
 #define ID_LEN 5 char **orderedIds; int i; int variableNumberOfElements = 5; /* Hard coded here */ orderedIds = (char **)malloc(variableNumberOfElements * (ID_LEN + 1) * sizeof(char)); ..