我读到strcpy
用于复制字符串,strdup
返回指向新字符串的指针以复制字符串。
您能否解释一下您更喜欢使用strcpy
的情况以及您更喜欢使用strdup
的情况?
答案 0 :(得分:98)
strcpy(ptr2, ptr1)
相当于while(*ptr2++ = *ptr1++)
其中strdup等同于
ptr2 = malloc(strlen(ptr1)+1);
strcpy(ptr2,ptr1);
(memcpy version可能效率更高)
因此,如果您希望在另一个函数中使用已复制的字符串(因为它在堆部分中创建),您可以使用strdup,否则strcpy就足够了。
答案 1 :(得分:48)
函数strcpy
和strncpy
是C标准库的一部分,可在现有内存上运行。也就是说,你必须提供函数复制字符串数据的内存,作为推论,你必须有自己的方法来找出你需要多少内存
通过约束,strdup
是一个Posix函数,它为您执行动态内存分配。它返回一个指向新分配的内存的指针,它已经复制了该字符串。但你现在负责这个记忆,最终必须free
。
这使strdup
成为“隐藏的malloc
”便利函数之一,这也可能也是它不属于标准库的原因。只要您使用标准库,就知道必须为每free
/ malloc
调用一个calloc
。但strdup
之类的函数会引入隐藏的malloc
,为了内存管理的目的,您必须将其视为malloc
。 (另一个这样的隐藏分配函数是GCC的abi::__cxa_demangle()
。)小心!
答案 2 :(得分:12)
strdup
为堆上的新字符串分配内存,同时使用strcpy
(或更安全的strncpy
varient)我可以将字符串复制到上的预分配内存堆或堆栈。
答案 3 :(得分:8)
在accepted answer中,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);
}
答案 4 :(得分:0)
char *strdup(char *pszSrch)
;
strdup
将按原始字符串的大小分配存储空间。如果存储分配成功,则将原始字符串复制到重复的字符串。
strdup
d失败时返回NULL
。如果未分配内存,则复制失败strdup
返回NULL
。