如何在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。