我读到这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
将分配存储原始字符串的大小。如果存储分配成功,则将原始字符串复制到重复字符串。
strdup
dNULL
失败返回。如果未分配内存,则复制失败strdup
return NULL
。