我读到的strcpy
是复制字符串,并strdup
返回一个指向新字符串的指针以复制该字符串。
您能否解释一下您喜欢使用strcpy
哪种情况以及您喜欢使用哪种情况strdup
?
Answers:
strcpy(ptr2, ptr1)
相当于 while(*ptr2++ = *ptr1++)
其中strdup等于
ptr2 = malloc(strlen(ptr1)+1);
strcpy(ptr2,ptr1);
(memcpy版本可能更有效)
因此,如果希望复制的字符串在另一个函数中使用(因为它是在堆部分中创建的),则可以使用strdup,否则使用strcpy就足够了。
while(*ptr2++ = *ptr1++)
!:)
函数strcpy
和strncpy
是C标准库的一部分,并在现有内存上运行。也就是说,你必须提供到其中的功能复制字符串数据的存储,并作为一个必然结果,你必须有自己的找出你需要多少内存的方式。
相比之下,strdup
它是Posix函数,它为您执行动态内存分配。它返回一个指向新分配的内存的指针,该内存已将字符串复制到该内存中。但是您现在必须对此内存负责,并且最终必须对此负责free
。
这使它strdup
成为“隐藏的malloc
”便利功能之一,并且大概也是为什么它不属于标准库的原因。只要您使用标准库,就知道您必须free
为malloc
/调用一个calloc
。但是,strdup
引入诸如hidden的功能malloc
,就malloc
内存管理而言,必须将其与视为相同。(另一个隐藏的分配功能是GCC的abi::__cxa_demangle()
。)当心!
strdup
分配存储器,用于在堆上新的字符串,同时使用strcpy
(或它的更安全strncpy
的变体光盘),我可以一个字符串复制到一个预先分配的存储器上或者堆或堆。
strcpy
复制到静态缓冲区吗?
在接受的答案中,的实现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);
}
strcpy
有效实现strdup
的实用性区分开来。
strdup()
ed字符串的生命周期可以延长到当前函数的末尾,但是无论如何都是这样(如果目标strcpy()
是调用方提供的缓冲区,全局变量,或者使用malloc()
或手动分配的本身new
) 。