strcpy vs strdup

时间:2012-12-24 10:53:51

标签: c strcpy strdup

我读到strcpy用于复制字符串,strdup返回指向新字符串的指针以复制字符串。

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

5 个答案:

答案 0 :(得分:98)

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

其中strdup等同于

ptr2 = malloc(strlen(ptr1)+1);
strcpy(ptr2,ptr1);

memcpy version可能效率更高)

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

答案 1 :(得分:48)

函数strcpystrncpy是C标准库的一部分,可在现有内存上运行。也就是说,必须提供函数复制字符串数据的内存,作为推论,必须有自己的方法来找出你需要多少内存

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

这使strdup成为“隐藏的malloc”便利函数之一,这也可能也是它不属于标准库的原因。只要您使用标准库,就知道必须为每free / malloc调用一个calloc。但strdup之类的函数会引入隐藏的malloc,为了内存管理的目的,您必须将其视为malloc。 (另一个这样的隐藏分配函数是GCC的abi::__cxa_demangle()。)小心!

答案 2 :(得分:12)

strdup为堆上的新字符串分配内存,同时使用strcpy(或更安全的strncpy varient)我可以将字符串复制到上的预分配内存堆或堆栈。

答案 3 :(得分:8)

accepted answer中,strdup的实施方式显示为:

ptr2 = malloc(strlen(ptr1)+1);
strcpy(ptr2,ptr1);

然而,这有些次优,因为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);
}

答案 4 :(得分:0)

char *strdup(char *pszSrch);

strdup将按原始字符串的大小分配存储空间。如果存储分配成功,则将原始字符串复制到重复的字符串。

strdup d失败时返回NULL。如果未分配内存,则复制失败strdup返回NULL

相关问题