2

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

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

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

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

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

4

4 回答 4

2

有了这个声明:

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

它读起来好像您正在定义一个 C 字符串数组,其计数 - 而不是单个字符串长度 - 是MAX_STRING_LENGTH.

最好定义 a **char,如下所示:

char **strings = malloc(sizeof(char *) * numstrings);

稍后在您的代码中,当您准备将字符串添加到例如插槽 5 时:

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

或在初始化循环中,例如:

for (i = 0; i < numstrings; i++)
    strings[i] = malloc(sizeof(char) * MAX_STRING_LENGTH);

而且,如果在某些时候您需要更多字符串realloc的空间,请使用来增加初始内存分配。

于 2012-07-24T17:56:28.600 回答
2
char (*strings)[MAX_STRING_LENGTH] = malloc(sizeof *strings * num_strings);

将分配一个num_stringsxMAX_STRING_LENGTH数组char作为一个连续的块,这样您就不必进行多级分配。

strcpy(strings[i], "This is a test");
printf("%s\n", strings[j]);

等当你完成后,你只需要free(strings);

num_strings这种方法的主要缺点是,如果请求非常大, 您可能没有足够的内存来满足请求,并且如果您的大多数字符串都短于 MAX_STRING_LENGTH,您将有一些内部碎片。

于 2012-07-24T18:39:50.107 回答
1
char **strings;

strings=(char **) malloc(number of strings);

strings[i]=(char *) malloc(MAX_STRING_LENGTH);
于 2012-07-24T17:55:15.857 回答
1

如果它真的是动态的,那么它可能需要是这样的:

char **strings = malloc( sizeof(char*) * numstrings );
for ( int i = 0; i < numstrings; i++ )  
    strings[i] = malloc( MAX_STRING_LENGTH );

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

于 2012-07-24T17:55:48.757 回答