2

我或多或少有一个想法,但我不确定我是否有正确的想法,我希望也许我只是错过了一些明显的东西。基本上,我有一个字符串数组(C字符串,所以基本上是一个指向字符数组的指针数组),如下所示:

char **words;

我不知道我最后会说多少字。当我解析字符串时,我希望能够调整数组的大小,添加一个指向单词的指针,然后移动到下一个单词然后重复。

我能想到的唯一方法可能是每次我到达数组末尾时都从一个合理的数字开始并重新分配,但我不完全确定这是否有效。就像我希望能够访问 words[0]、words[1] 等。如果我有 char **words[10] 并调用

realloc(words, n+4)  //assuming this is correct since pointers are 4 bytes

一旦我到达数组的末尾,如果我做了 words[11] = new word,那是否有效?

4

3 回答 3

3

跟踪您的数组大小:

size_t arr_size = 10;

并给它一个初始内存块:

char **words = malloc( arr_size * sizeof(char*) );

填满所有位置后,您可能希望将数组大小加倍:

size_t tailIdx = 0;

while( ... ) {
    if( tailIdx >= arr_size ) {
        char **newWords;
        arr_size *= 2;
        newWords = realloc(words, arr_size * sizeof(char*) );
        if( newWords == NULL ) { some_error() };
        words = newWords;
    }
    words[tailIdx++] = get_next_word();
}

...

free(words);
于 2013-01-17T00:49:01.293 回答
2

这种方法很好,尽管您可能想要这样做realloc(words, n * 2)。调用realloc并且malloc很昂贵,因此您希望尽可能少地重新分配,这意味着您可以在不重新分配(并且可能复制数据)的情况下持续更长时间。这就是大多数缓冲区是如何实现分摊分配和复制成本的。因此,每次空间不足时,只需将缓冲区大小加倍。

于 2013-01-17T00:46:29.397 回答
2

您可能想要分配多个内存块。一个 for words,它将包含指针数组。然后每个单词的另一个块,将由words数组中的元素指向。

然后添加元素涉及realloc()words数组,然后为每个新单词分配新的内存块。

请注意如何编写清理代码。您需要确保释放所有这些块。

于 2013-01-17T00:47:28.667 回答