strcpy vs strdup

joh*_*han 65 c strdup strcpy

我读到的strcpy是复制字符串,并strdup返回指向新字符串的指针以复制字符串.

您能否解释一下您喜欢使用strcpy哪些情况以及您更喜欢使用哪些情况strdup

小智 100

strcpy(ptr2, ptr1) 相当于 while(*ptr2++ = *ptr1++)

strdup相当于

ptr2 = malloc(strlen(ptr1)+1);
strcpy(ptr2,ptr1);
Run Code Online (Sandbox Code Playgroud)

(memcpy版本可能更有效)

因此,如果您希望在另一个函数中使用已复制的字符串(因为它在堆部分中创建),则可以使用strdup,否则strcpy就足够了.

  • 真的很喜欢`while(*ptr2 ++ =*ptr1 ++)`!:) (7认同)
  • 除了最后一句,这是令人困惑的好答案.我猜你的意思是`strdup()`ed字符串的生命周期可以超出当前函数的结尾,但无论如何都是这样的情况(如果`strcpy()`的目标是调用者提供的缓冲区,全局变量,或者使用`malloc()`或`new`手动分配的全局变量. (4认同)
  • @sbhatla在C字符串中以nulbyte结束,其结果为false,赋值表达式的计算结果为赋值. (2认同)

Ker*_* SB 50

的功能strcpystrncpy是C标准库的一部分,并在现有的存储器操作.也就是说,必须提供函数复制字符串数据的内存,作为必然结果,必须拥有自己的方法来查找所需的内存量.

通过对比,strdup是一个Posix函数,它为您执行动态内存分配.它返回一个指向新分配的内存的指针,它已经复制了该字符串.但是现在要对这种记忆负责,最终必须free这样做.

这使得strdup其中一个"隐藏malloc"的便利功能,这可能也是为什么它不是标准库的一部分.只要您使用标准库,您就知道必须free为每个malloc/ 调用一个calloc.但是strdup引入隐藏的功能malloc,你必须将其视为一个malloc用于内存管理的目的.(另一个这样隐藏的分配功能是GCC的abi::__cxa_demangle().)小心!

  • 啊,我一直想知道为什么这不在 stdlib 中,现在我知道了。 (2认同)

Ore*_*ren 13

strdup分配用于在堆上新的字符串存储器,同时使用strcpy(或它的更安全strncpy的变体光盘),我可以一个字符串复制到一个预先分配的存储器上或者堆或堆.


小智 8

接受的答案中,执行情况strdup表示为:

ptr2 = malloc(strlen(ptr1)+1);
strcpy(ptr2,ptr1);
Run Code Online (Sandbox Code Playgroud)

然而,有些次优的,因为两者strlenstrcpy需要通过检查每个字符是一个查找的字符串的长度\0.

使用memcpy应该更有效:

char *strdup(const char *src) {
    size_t len = strlen(src) + 1;
    char *s = malloc(len);
    if (s == NULL)
        return NULL;
    return (char *)memcpy(s, src, len);
}
Run Code Online (Sandbox Code Playgroud)