如果我有一个名为“totalstrings”的var中的项目数和一个名为“string size”的var,它是每个项目的字符串大小,我该如何动态分配一个名为“array?”的数组?
这是C中的字符串数组,而不是C ++。
谢谢!
答案 0 :(得分:20)
注意:我的示例不检查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)
。
答案 1 :(得分:11)
用于分配任何类型T的N×M阵列的常用习语是
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
,则只需在一个地方进行更改即可。
答案 2 :(得分:4)
char** stringList = (char**)malloc(totalStrings * sizeof(char*));
for( i=0; i<totalStrings; i++ ) {
stringList[i] = (char*)malloc(stringSize[i]+1);
}
答案 3 :(得分:0)
好吧,首先你可能想为“数组”分配空间,这将是一个char *数组,其长度为“totalstrings”。
那么“数组”中的起始和最终索引是什么?你知道第一个是0;什么是最后一个?
然后,对于“数组”中的每个条目,你可以(如果你想的话)分配一个内存区域,即“stringsize + 1”(为什么+1,祈祷告诉我?)long,将起始地址设置为area - 该字符串 - 成为“数组”的正确成员。
那将是一个好的开始,imo。
答案 4 :(得分:0)
我知道这个问题很老,已经有人回答了。我只想指出 malloc
是一个系统调用,不应多次使用。
最好分配一大块内存并使数组指向它。像这样:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define STR_SIZE 100 //STR_SIZE doesn't have to be a constant
int main(){
int i;
char **arr;
char *long_string;
long_string = (char *)malloc(sizeof(char)*STR_SIZE*10);
arr = malloc(sizeof(char *)*10);
//Pointing each item of the array to an allocated memory.
for (i=0; i<10; i++){
arr[i] = (long_string + STR_SIZE * i);
}
//Initialising the array
for (i=0; i<10; i++){
strcpy(arr[i], "This is a line in a\
paragraph\n");
}
//Printing the items of the array
for (i=0; i<10; i++){
printf("%s \n", arr[i]);
}
//freeing the allocated memory
free(long_string);
free(arr);
return 0;
}