C动态字符串长度

时间:2009-03-22 20:48:01

标签: c string dynamic

在C中创建动态字符串有不同的方法(长度不断变化)。经过一些谷歌搜索后,主要的方法是使用realloc()

我实现这个的方法是使用每个节点有32个字节块的链表。

我想知道除了使用realloc()和链接列表之外是否有更好的解决方法,以及每种方法的缺点和优点。

编辑我这样做的原因是因为我从套接字 recv()接收动态数据,并且正在寻找一种灵活的存储方式,没有分配大量不需要的数据。

4 个答案:

答案 0 :(得分:3)

您可以重新分配到不同的预定义大小。例如,当缓冲区已满时,其大小加倍。

使用链表是一个好主意,但数据不是连续的(例如,您无法将整个结构传递给printf)并且索引需要更多的计算(O(N))。一个主要的优点是附加字符串(在任一端)是O(1)。

答案 1 :(得分:2)

我认为您正在寻找Scatter-Gather I/O,您正在寻找的功能将是readv()

答案 2 :(得分:1)

如果你使用realloc(),不要在每个realloc上添加一定量的空间,因为生成长度为n的字符串的成本将是O(n ^ 2)(realloc可能会分配一个新区域并在那里复制数据,即其复杂性不是恒定的,而是O(n))。最简单的方法是在每个realloc上加倍缓冲区的大小,然后摊销的成本仍为O(n)。

答案 3 :(得分:1)

使用32字节块意味着数据和开销之间的比例非常糟糕 - 您的指针位于链表中,并且至少(可能更多)指针从内存分配器再次出现。我强烈建议分配更大的内存块并以指数方式增长以适应并查看是否会导致问题。只有遇到问题,才能进入链表路线。