这个实现对你有意义吗?我正在尝试编写一个连接两个字符串的函数,可以调用appendstr(&dest, "xyz");
我不确定这是一个很好的做法,我正在做什么,重新分配newptr
超过origptr
的空间,然后释放它,使其等于newptr
。< / p>
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
中不改变任何内容,直到我确定内存分配没有问题,然后再进行连接。
另外,另一个问题是我是否正在分配我需要的内存量。
答案 0 :(得分:4)
这应该足够了。这只是没有free()
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);
*origptr = newptr;
}
return newptr;
}
如果无法连接字符串,则返回NULL
,并且*origptr
不会更改。否则,它返回(可能是新的)分配的指针,数据连接在一起。然后*origptr
将具有与返回值相同的值。
memcpy()
而非strcat()
因为strcat()
需要通过内部调用strlen()
(或执行自己的strlen()
版本)来知道字符串的结束位置。无论如何你调用strlen()
是因为你需要字符串的长度来计算要分配的内存量,你可以使用memcpy()
直接复制第一个字符串后面的第二个字符串,跳过一个隐含的第二个字符串如果使用strlen()
,请致电strcat()
。