80

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

您能否解释一下您喜欢使用strcpy哪些案例以及您喜欢使用哪些案例strdup

4

5 回答 5

114

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

其中 strdup 相当于

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

memcpy 版本可能更有效)

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

于 2012-12-24T11:51:50.013 回答
63

函数strcpystrncpy是 C 标准库的一部分,对现有内存进行操作。也就是说,必须提供函数将字符串数据复制到其中的内存,并且作为推论,必须有自己的方法来找出您需要多少内存。

相比之下,strdup它是一个 Posix 函数,它为您执行动态内存分配。它返回一个指向新分配的内存的指针,它已将字符串复制到该内存中。但现在要对这段记忆负责,而且最终必须要负责free

这使得strdup它成为“隐藏malloc”的便利功能之一,这可能也是它不是标准库的一部分的原因。只要您使用标准库,您就知道必须free为每个malloc/调用一个calloc。但是strdup引入了一个 hidden等函数,为了内存管理malloc,你必须把它和 a 一样对待。malloc(另一个这样的隐藏分配函数是 GCC 的abi::__cxa_demangle()。)当心!

于 2012-12-24T12:36:39.537 回答
16

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

于 2012-12-24T10:57:57.903 回答
14

接受的答案中,的实现strdup表示为:

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

但是,这有点不太理想,因为两者都strlen需要strcpy通过检查每个字符是否为\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);
}
于 2016-06-25T22:01:11.830 回答
0

char *strdup(char *pszSrch);

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

strdupdNULL失败返回。如果未分配内存,则复制失败strdupreturn NULL

于 2014-02-07T04:52:54.403 回答