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就足够了。

函数strcpystrncpy是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); 

但是,这是有些次优,因为strlenstrcpy需要通过检查每个字符是否为\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