我读到这strcpy是用于复制字符串,并strdup返回指向新字符串的指针以复制字符串。
您能否解释一下您喜欢使用strcpy哪些案例以及您喜欢使用哪些案例strdup?
strcpy(ptr2, ptr1)相当于while(*ptr2++ = *ptr1++)
其中 strdup 相当于
ptr2 = malloc(strlen(ptr1)+1);
strcpy(ptr2,ptr1);
(memcpy 版本可能更有效)
因此,如果您希望将复制的字符串用于另一个函数(因为它是在堆部分创建的),您可以使用 strdup,否则 strcpy 就足够了。
函数strcpy和strncpy是 C 标准库的一部分,对现有内存进行操作。也就是说,您必须提供函数将字符串数据复制到其中的内存,并且作为推论,您必须有自己的方法来找出您需要多少内存。
相比之下,strdup它是一个 Posix 函数,它为您执行动态内存分配。它返回一个指向新分配的内存的指针,它已将字符串复制到该内存中。但你现在要对这段记忆负责,而且最终必须要负责free。
这使得strdup它成为“隐藏malloc”的便利功能之一,这可能也是它不是标准库的一部分的原因。只要您使用标准库,您就知道必须free为每个malloc/调用一个calloc。但是strdup引入了一个 hidden等函数,为了内存管理malloc,你必须把它和 a 一样对待。malloc(另一个这样的隐藏分配函数是 GCC 的abi::__cxa_demangle()。)当心!
strdup为堆上的新字符串分配内存,同时使用strcpy(或其更安全的变体)我可以将字符串复制到堆或堆栈strncpy上的预分配内存。
在接受的答案中,的实现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);
}
char *strdup(char *pszSrch);
strdup将分配存储原始字符串的大小。如果存储分配成功,则将原始字符串复制到重复字符串。
strdupdNULL失败返回。如果未分配内存,则复制失败strdupreturn NULL。