如何在C中动态分配字符串数组?

如果我有一个名为“totalstrings”的var中的项目数和一个名为“string size”的var,它是每个项目的字符串大小,我该如何动态分配一个名为“array?”的数组。

这是C中的字符串数组,而不是C ++。

谢谢!

注意:我的示例不检查malloc()的NULL返回…但是你真的应该这样做; 如果您尝试使用NULL指针,您将崩溃。

首先,您必须创建一个char指针数组,每个字符串对应一个字符串(char *):

char **array = malloc(totalstrings * sizeof(char *));

接下来,您需要为每个字符串分配空间:

 int i; for (i = 0; i < totalstrings; ++i) { array[i] = (char *)malloc(stringsize+1); } 

当你完成使用数组时,你必须记住free()你分配的每个指针。 也就是说,循环遍历数组,在每个元素上调用free() ,最后是free(array)

用于分配任何类型T的N个Marrays的常用习语是

 T **a = malloc(N * sizeof *a); if (a) for (i = 0; i < N; i++) a[i] = malloc(M * sizeof *a[i]); 

从1989年的标准来看,你不需要转换malloc的结果,事实上这样做被认为是不好的做法(如果忘记包含stdlib.h或者没有原型,它可以抑制有用的诊断适用于范围内的malloc )。 早期版本的C有malloc返回char * ,所以演员是必要的,但你必须使用1989年之前的编译器的几率在这一点上非常遥远。 C ++ 确实需要强制转换,但是如果你正在编写C ++,那么你应该使用new运算符。

其次,请注意我将sizeof运算符应用于正在分配的对象; 表达式*a的类型是T **a[i]的类型是T (在你的情况下, T == char )。 这样您就不必担心将sizeof表达式与所分配对象的类型保持同步。 IOW,如果你决定使用wchar而不是char ,你只需要在一个地方进行更改。

 char** stringList = (char**)malloc(totalStrings * sizeof(char*)); for( i=0; i 

好吧,首先你可能想为“数组”分配空间,这将是一个char *的数组,其长度为“totalstrings”。

那么“数组”中的起始和最终索引是什么? 你知道第一个是0; 什么是最后一个?

然后,对于“数组”中的每个条目,你可以(如果你想的话)分配一个“stringsize + 1”的内存区域(为什么+1,祈祷告诉我?)long,把那个区域的起始地址 – 该字符串 – 进入“数组”的正确成员。

这将是一个良好的开端,imo。