strcpy vs strdup
我读strcpy
是为了复制一个string,而strdup
返回一个指向新string的指针来复制string。
你能解释一下你喜欢使用strcpy
情况吗?你喜欢用什么情况下使用strdup
?
strcpy(ptr2, ptr1)
相当于while(*ptr2++ = *ptr1++)
其中strdup相当于
ptr2 = malloc(strlen(ptr1)+1); strcpy(ptr2,ptr1);
( memcpy版本可能更有效率)
所以,如果你想要复制的string在另一个函数中使用(因为它是在堆部分中创build的),你可以使用strdup,否则strcpy就足够了。
函数strcpy
和strncpy
是C标准库的一部分,可以在现有的内存上运行。 也就是说, 你必须提供函数将string数据复制到其中的内存,作为必然结果, 你必须有自己的方法来找出你需要多less内存。
通过对比, strdup
是一个Posix函数,它为您执行dynamic内存分配。 它返回一个指向新分配的内存的指针,它已经复制了string。 但是你现在负责这个记忆,最终必须把它free
。
这就使得它成为了“隐藏的malloc
”便利函数之一,这也是为什么它不是标准库的一部分。 只要您使用标准库,您就知道必须为每个malloc
/ calloc
调用一个free
库。 但是像strdup
这样的函数会引入一个隐藏的malloc
,为了内存pipe理的目的,你必须把它和malloc
一样对待。 (另一个这样的隐藏分配函数是GCC的abi::__cxa_demangle()
。)当心!
strdup
为堆上的新string分配内存,而使用strcpy
(或更安全的strncpy
varient)我可以将string复制到堆或堆栈上的预先分配的内存。
在接受的答案中 , strdup
的实现如下所示:
ptr2 = malloc(strlen(ptr1)+1); strcpy(ptr2,ptr1);
但是,这是有些次优,因为strlen
和strcpy
需要通过检查每个字符是否为\0
来查找string的长度。
使用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
将分配存储的原始string的大小。 如果存储分配成功,则将原始string复制到重复string。
strdup
在失败时返回NULL
。 如果内存未分配,则复制失败, strdup
返回NULL
。