我或多或少有一个想法,但我不确定我是否有正确的想法,我希望也许我只是遗漏了一些明显的东西。基本上,我有和字符串数组(C字符串,所以基本上是一个指向字符数组的指针数组),如下所示:
char **words;
我不知道我到底会说多少字。当我解析字符串时,我希望能够调整数组的大小,添加指向单词的指针,然后继续下一个单词然后重复。
我能想到的唯一方法是,每当我到达阵列的末尾时,可能从一个合理的数字开始并重新分配,但我并不完全确定它有效。就像我希望能够访问单词[0],单词[1]等等。如果我有单词[10]并且被称为
realloc(words, n+4) //assuming this is correct since pointers are 4 bytes
一旦我到达数组的末尾,如果我做了单词[11] = 新单词,那是否有效?
答案 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)
。调用realloc
和malloc
代价很高,因此您希望尽可能少地重新分配,这意味着您可以在不重新分配(并可能复制数据)的情况下延长时间。这是实施大多数缓冲区以分摊和复制成本的方式。因此,每次空间不足时,只需将缓冲区大小加倍。
答案 2 :(得分:2)
您可能想要分配多个内存块。一个用于words
,它将包含指针数组。然后是每个单词的另一个块,它将由words
数组中的元素指向。
添加元素然后涉及realloc()
words
数组,然后为每个新单词分配新的内存块。
小心如何编写清理代码。你需要确保释放所有这些块。