【发布时间】:2011-10-04 18:19:17
【问题描述】:
如果我有一个名为“totalstrings”的变量和一个名为“字符串大小”的变量(即每个项目的字符串大小)中的项目数,我如何动态分配一个名为“数组”的数组?
这是 C 中的字符串数组,而不是 C++。
谢谢!
【问题讨论】:
-
这取决于您可能尝试过什么以及没有什么效果。
-
当然还有为什么你认为它不起作用。
标签: c
如果我有一个名为“totalstrings”的变量和一个名为“字符串大小”的变量(即每个项目的字符串大小)中的项目数,我如何动态分配一个名为“数组”的数组?
这是 C 中的字符串数组,而不是 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)。
【讨论】:
malloc 返回 NULL 通常是一个太严重的错误,无法继续,无论如何。我们不想过于偏执,不是吗?真正错误的是malloc 的返回值的转换,这在C 中是完全不必要的,通常是不好的做法(但没关系,我也来自C++ 背景)。否则很好的答案。 +1 正确地记住free。
realloc()你的数组到更大的尺寸。
分配任何类型 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,您只需在一处进行更改。
【讨论】:
char** stringList = (char**)malloc(totalStrings * sizeof(char*));
for( i=0; i<totalStrings; i++ ) {
stringList[i] = (char*)malloc(stringSize[i]+1);
}
【讨论】:
我知道这个问题已经过时并且已经得到解答。我只想指出,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;
}
【讨论】:
好吧,首先您可能想为“array”分配空间,它是一个长为“totalstrings”的 char * 数组。
那么“数组”中的起始索引和最终索引是什么?你知道第一个是0;最后一个是什么?
然后,对于“array”中的每个条目,您可以(如果需要)分配一个长度为“stringsize+1”(为什么是 +1,请告诉我?)的内存区域,并将其起始地址放在区域——那个字符串——进入“数组”的正确成员。
这将是一个好的开始,imo。
【讨论】: