假设我有一个用new.Now分配的字符数组,如果我想修改数组的大小,那么以下哪两个是最好的方法? 1.使用realloc函数 OR 2.分配一个新数组,将数据从旧数组复制到新数组,然后删除旧数组。
答案 0 :(得分:2)
使用malloc(非新)分配块,然后使用realloc。 realloc知道扩展块后有多少可用空间。
s2 = realloc(s,<size>);
if (s2) {
s = s2;
}
else {
free up s and handle the error
}
我见过的大多数代码都没有正确处理realloc的失败。
答案 1 :(得分:1)
您无法将realloc可移植地应用于使用new分配的缓冲区。因此,只有你的第二个选择是可行的。
考虑切换到std :: vector和std :: string。
答案 2 :(得分:1)
我认为你从C的角度思考整个问题。
如果您正在使用vector
来处理数组,则它是动态的并且避免您在问题中陈述的问题
e.g。
vector v(10); // allocates an array of 10 initialized to 0
v.push_back(42); // added another, so now array is 11 long
答案 3 :(得分:1)
如果realloc
发现块后面没有足够的可用空间,则第一个选项也意味着复制。 (即使您使用malloc
来分配数组,这是唯一正确使用realloc
的选项。)
但是,如果在每次重新分配时将数组的大小加倍(或将其大小乘以常数&gt; 1),则“将数组增加1”操作平均使用常量时间。搜索Constant Amortized Time。
假设一个初始大小为n的数组。重新分配到新的大小2n并复制成本2n步,但下一个n“增加”操作是免费的。
顺便说一句,这就是std::vector
和许多其他数组容器在内部实现的方式。