【发布时间】:2013-12-21 22:34:23
【问题描述】:
这个实现对您有任何意义吗?我正在尝试编写一个将连接两个字符串并可以称为appendstr(&dest, "xyz"); 的函数
我完全不确定我在这里所做的是否是一个好习惯,重新分配newptr 的空间超过origptr,然后释放它并使其等于newptr。
void *appendstr(char **origptr, const char *strdata)
{
size_t len1 = strlen(*origptr);
size_t len2 = strlen(strdata);
char *newptr = realloc(*origptr, len1 + len2 + 1);
if (newptr != NULL)
{
memcpy(newptr + len1, strdata, len2 + 1);
free(*origptr);
*origptr = newptr;
}
return newptr;
}
我要做的就是不要更改*origptr 中的任何内容,直到我确定内存分配没有问题,然后才进行连接。
另外,另一个问题是我是否准确地分配了我需要的内存量。
【问题讨论】:
-
不需要释放(*origptr)。如果 newptr 与 origptr 不同,realloc() 会这样做。
-
你有理由不只使用 strcat(...) 吗? [查看这篇文章。][1] [1]:stackoverflow.com/questions/308695/c-string-concatenation
-
如果
realloc()无法分配新空间,则返回NULL,原指针仍然有效,但没有多余空间。 -
@NonlinearIdeas:是的,有充分的理由不使用
strcat(),特别是它必须重新扫描重新分配空间的第一个len1字节才能找到代码已经知道的空值在newptr + len1。使用memcpy()可以保存重新扫描。 -
提示:如果您打算多次连接,最好总是四舍五入到 2 的下一次幂,以接近最终大小 O(log N)。