我读到的strcpy是复制字符串,并strdup返回指向新字符串的指针以复制字符串.
您能否解释一下您喜欢使用strcpy哪些情况以及您更喜欢使用哪些情况strdup?
小智 100
strcpy(ptr2, ptr1) 相当于 while(*ptr2++ = *ptr1++)
strdup相当于
ptr2 = malloc(strlen(ptr1)+1);
strcpy(ptr2,ptr1);
Run Code Online (Sandbox Code Playgroud)
(memcpy版本可能更有效)
因此,如果您希望在另一个函数中使用已复制的字符串(因为它在堆部分中创建),则可以使用strdup,否则strcpy就足够了.
Ker*_* SB 50
的功能strcpy和strncpy是C标准库的一部分,并在现有的存储器操作.也就是说,您必须提供函数复制字符串数据的内存,作为必然结果,您必须拥有自己的方法来查找所需的内存量.
通过对比,strdup是一个Posix函数,它为您执行动态内存分配.它返回一个指向新分配的内存的指针,它已经复制了该字符串.但是你现在要对这种记忆负责,最终必须free这样做.
这使得strdup其中一个"隐藏malloc"的便利功能,这可能也是为什么它不是标准库的一部分.只要您使用标准库,您就知道必须free为每个malloc/ 调用一个calloc.但是strdup引入隐藏的功能malloc,你必须将其视为一个malloc用于内存管理的目的.(另一个这样隐藏的分配功能是GCC的abi::__cxa_demangle().)小心!
小智 8
在接受的答案中,执行情况strdup表示为:
ptr2 = malloc(strlen(ptr1)+1);
strcpy(ptr2,ptr1);
Run Code Online (Sandbox Code Playgroud)
然而,有些次优的,因为两者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);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
66282 次 |
| 最近记录: |