复制/连接动态分配的C风格字符串

Copy/concatenate dynamically allocated C style strings

本文关键字:风格 字符串 动态分配 连接 复制      更新时间:2023-10-16

我试图写一个函数来连接两个动态分配的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"分配不会反映在调用函数上。

两种可能的解决方案:

  1. 调用者函数应该用新的长度重新分配"dest",然后传递给concat()。在这种情况下,concat()不会执行重新分配。

  2. 如果允许concat()执行重新分配,那么,它的原型应该更改为:

    a) void concat(char** dest, char *source); -> strcat/strncat可以按照Jonathan Leffler的建议在这种情况下使用

    b) char* concat(char* dest, char *source); ->在这种情况下需要返回新分配的"dest"