如何为任意大小的固定长度C字符串数组分配内存

时间:2012-07-24 17:51:54

标签: c arrays string

我正在尝试为C字符串数组分配内存。我可以保证字符串符合MAX_STRING_LENGTH个字符,但我在编译时不知道数组中有多少个字符串(这是动态计算的)。当我使用代码时......

char *strings[MAX_STRING_LENGTH] = malloc( sizeof(char *) * numstrings );

...编译器抱怨这是一个无效的初始化程序。当我使用代码时......

char strings[MAX_STRING_LENGTH][] = malloc( sizeof(char *) * numstrings );

...编译器抱怨元素类型不完整。我在这里做错了什么,如何为这个数组分配内存?

4 个答案:

答案 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 );

也可以将它全部分配到一个块中(使释放更容易),然后将数组中的各个指针分配给已分配缓冲区中的计算位置。但是,这增加了一些可能不会超过收益的复杂性。