C - 调整指针数组的大小

时间:2013-01-17 00:43:52

标签: c arrays c-strings

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

char **words;

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

我能想到的唯一方法是,每当我到达阵列的末尾时,可能从一个合理的数字开始并重新分配,但我并不完全确定它有效。就像我希望能够访问单词[0],单词[1]等等。如果我有单词[10]并且被称为

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

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

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分:2)

这种方法很好,但您可能希望改为realloc(words, n * 2)。调用reallocmalloc代价很高,因此您希望尽可能少地重新分配,这意味着您可以在不重新分配(并可能复制数据)的情况下延长时间。这是实施大多数缓冲区以分摊和复制成本的方式。因此,每次空间不足时,只需将缓冲区大小加倍。

答案 2 :(得分:2)

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

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

小心如何编写清理代码。你需要确保释放所有这些块。