我正在尝试为C字符串数组分配内存。我可以保证字符串符合MAX_STRING_LENGTH
个字符,但我在编译时不知道数组中有多少个字符串(这是动态计算的)。当我使用代码时......
char *strings[MAX_STRING_LENGTH] = malloc( sizeof(char *) * numstrings );
...编译器抱怨这是一个无效的初始化程序。当我使用代码时......
char strings[MAX_STRING_LENGTH][] = malloc( sizeof(char *) * numstrings );
...编译器抱怨元素类型不完整。我在这里做错了什么,如何为这个数组分配内存?
答案 0 :(得分:2)
有了这个声明:
char *strings[MAX_STRING_LENGTH] = malloc(sizeof(char *) * numstrings);
它读起来好像你要定义一个C字符串数组,其数量 - 而不是单个字符串长度 - 是MAX_STRING_LENGTH
。
最好定义一个**char
,如下所示:
char **strings = malloc(sizeof(char *) * numstrings);
稍后在您的代码中,当您准备将字符串添加到例如第5行:
strings[5] = malloc(sizeof(char) * MAX_STRING_LENGTH));
或在init循环中,例如:
for (i = 0; i < numstrings; i++)
strings[i] = malloc(sizeof(char) * MAX_STRING_LENGTH);
并且,如果在某些时候您需要更多字符串的空间,请使用realloc
来增加初始内存分配。
答案 1 :(得分:2)
char (*strings)[MAX_STRING_LENGTH] = malloc(sizeof *strings * num_strings);
将num_strings
x MAX_STRING_LENGTH
数组char
分配为连续的块,这样您就不必进行多级分配。
strcpy(strings[i], "This is a test");
printf("%s\n", strings[j]);
等。当你完成后,你只需要free(strings);
。
此方法的主要缺点是,如果num_strings
非常大,您可能没有足够的内存来满足请求,并且如果大多数字符串都短于MAX_STRING_LENGTH,则会有一些内部碎片。
答案 2 :(得分:1)
char **strings;
strings=(char **) malloc(number of strings);
strings[i]=(char *) malloc(MAX_STRING_LENGTH);
答案 3 :(得分:1)
如果它真的是动态的,那么它可能需要是这样的:
char **strings = malloc( sizeof(char*) * numstrings );
for ( int i = 0; i < numstrings; i++ )
strings[i] = malloc( MAX_STRING_LENGTH );
也可以将它全部分配到一个块中(使释放更容易),然后将数组中的各个指针分配给已分配缓冲区中的计算位置。但是,这增加了一些可能不会超过收益的复杂性。