Copy/concatenate 动态分配的 C 风格字符串
Copy/concatenate dynamically allocated C style strings
我正在尝试编写一个函数来连接两个动态分配的 C 风格字符串。我的设计是否正确,您首先必须将目标复制到临时 char[]
,删除原始内存分配,获取两个 char[]
的长度,然后使用该新长度分配新内存将字符复制到 dest[]
?
所以伪代码:
void concat(char* dest, char *source)
{
char temp = dest;
delete [] dest;
char dest = new char [new size];
copy temp to dest;
copy source to dest;
}
我是不是从根本上误解了这一点?
不要删除 dest
,因为它可能指向非动态内存。然后使用 strcat
或更安全的 strncat
.
如果源和目标重叠,则必须复制到临时缓冲区,否则则不需要。使用 C char*
,这可能会发生,您可能会得到 mycat(str+2, str)
作为测试用例。
您的 concat() 原型 是:
void concat(char* dest, char *source);
因此,在 concat() 函数中新分配的 "dest" 不会反映在调用函数中。
两种可能的解决方案:
调用函数应该重新分配 "dest" 新的长度,然后传递给 concat()。在这种情况下,concat() 不会执行重新分配。
如果允许concat()进行再分配,那么它的原型应该改为:
a) void concat(char** dest, char *source);
-> strcat/strncat 可以按照 Jonathan Leffler
的建议在这种情况下使用
b) char* concat(char* dest, char *source);
-> 需要 return 新分配 "dest" 在这种情况下
我正在尝试编写一个函数来连接两个动态分配的 C 风格字符串。我的设计是否正确,您首先必须将目标复制到临时 char[]
,删除原始内存分配,获取两个 char[]
的长度,然后使用该新长度分配新内存将字符复制到 dest[]
?
所以伪代码:
void concat(char* dest, char *source)
{
char temp = dest;
delete [] dest;
char dest = new char [new size];
copy temp to dest;
copy source to dest;
}
我是不是从根本上误解了这一点?
不要删除 dest
,因为它可能指向非动态内存。然后使用 strcat
或更安全的 strncat
.
如果源和目标重叠,则必须复制到临时缓冲区,否则则不需要。使用 C char*
,这可能会发生,您可能会得到 mycat(str+2, str)
作为测试用例。
您的 concat() 原型 是:
void concat(char* dest, char *source);
因此,在 concat() 函数中新分配的 "dest" 不会反映在调用函数中。
两种可能的解决方案:
调用函数应该重新分配 "dest" 新的长度,然后传递给 concat()。在这种情况下,concat() 不会执行重新分配。
如果允许concat()进行再分配,那么它的原型应该改为:
a)
的建议在这种情况下使用void concat(char** dest, char *source);
-> strcat/strncat 可以按照 Jonathan Lefflerb)
char* concat(char* dest, char *source);
-> 需要 return 新分配 "dest" 在这种情况下