首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >strcpy vs strdup

strcpy vs strdup
EN

Stack Overflow用户
提问于 2012-12-24 18:53:51
回答 5查看 78K关注 0票数 80

我了解到strcpy用于复制字符串,而strdup返回一个指向新字符串的指针来复制该字符串。

您能解释一下在哪些情况下更喜欢使用strcpy吗?在哪些情况下您更喜欢使用strdup

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-12-24 19:51:50

strcpy(ptr2, ptr1)等同于while(*ptr2++ = *ptr1++)

其中,as strdup等同于

代码语言:javascript
复制
ptr2 = malloc(strlen(ptr1)+1);
strcpy(ptr2,ptr1);

(memcpy version可能更有效率)

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

票数 112
EN

Stack Overflow用户

发布于 2012-12-24 20:36:40

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

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

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

票数 60
EN

Stack Overflow用户

发布于 2012-12-24 18:57:58

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

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14020380

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档