我读到strcpy用于复制字符串,strdup返回一个指向新字符串的指针以复制该字符串。您能解释一下您喜欢在哪些情况下使用strcpy,在哪些情况下使用strdup吗?
strcpy
strdup
vptzau2j1#
strcpy(ptr2, ptr1)相等while(*ptr2++ = *ptr1++)其中strdup相当于
strcpy(ptr2, ptr1)
while(*ptr2++ = *ptr1++)
ptr2 = malloc(strlen(ptr1)+1); strcpy(ptr2,ptr1);
(memcpy version可能更有效)所以如果你想把你复制的字符串用在另一个函数中(因为它是在heap部分创建的),你可以使用strdup,否则strcpy就足够了。
nfzehxib2#
函数strcpy和strncpy是C标准库的一部分,并且在现有内存上操作。也就是说,* 您 * 必须提供函数将字符串数据复制到其中的内存,作为推论,* 您 * 必须有自己的方法来找出您需要多少内存。相比之下,strdup是一个Posix函数,它为你执行动态内存分配。它返回一个指针,指向它将字符串复制到的新分配的内存。但是 you 现在要对这个内存负责,最终必须free它。这使得strdup成为“隐藏的malloc“便利函数之一,这大概也是它不属于标准库的原因。只要使用标准库,就知道必须为每个malloc/calloc调用一个free。但是像strdup这样的函数引入了一个隐藏的malloc,并且出于内存管理的目的,您必须将其视为malloc。(另一个这样的隐藏分配函数是愚者的abi::__cxa_demangle()。)
strncpy
free
malloc
calloc
abi::__cxa_demangle()
ifsvaxew3#
strdup为堆上的新字符串分配内存,而使用strcpy(或其更安全的strncpy变体)我可以将字符串复制到堆或堆栈上的预分配内存中。
pieyvz9o4#
在accepted answer中,strdup的实现表示为:
然而,这在某种程度上是次优的,因为strlen和strcpy都需要通过检查每个字符是否是\0来查找字符串的长度。使用memcpy应该会更有效率:
strlen
\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); }
qij5mzcb5#
char *strdup(char *pszSrch) ;strdup将分配原始字符串大小的存储空间。如果存储空间分配成功,原始字符串将被复制到复制字符串。strdup d失败时返回NULL如果内存未分配,复制失败strdup返回NULL
char *strdup(char *pszSrch)
NULL
11dmarpk6#
对于 *memcpy,另一种没有dest和src增量实现是可能的:while ( n-- ) { dest[n] = src[n] }
while ( n-- ) { dest[n] = src[n] }
6条答案
按热度按时间vptzau2j1#
strcpy(ptr2, ptr1)
相等while(*ptr2++ = *ptr1++)
其中strdup相当于
(memcpy version可能更有效)
所以如果你想把你复制的字符串用在另一个函数中(因为它是在heap部分创建的),你可以使用strdup,否则strcpy就足够了。
nfzehxib2#
函数
strcpy
和strncpy
是C标准库的一部分,并且在现有内存上操作。也就是说,* 您 * 必须提供函数将字符串数据复制到其中的内存,作为推论,* 您 * 必须有自己的方法来找出您需要多少内存。相比之下,
strdup
是一个Posix函数,它为你执行动态内存分配。它返回一个指针,指向它将字符串复制到的新分配的内存。但是 you 现在要对这个内存负责,最终必须free
它。这使得
strdup
成为“隐藏的malloc
“便利函数之一,这大概也是它不属于标准库的原因。只要使用标准库,就知道必须为每个malloc
/calloc
调用一个free
。但是像strdup
这样的函数引入了一个隐藏的malloc
,并且出于内存管理的目的,您必须将其视为malloc
。(另一个这样的隐藏分配函数是愚者的abi::__cxa_demangle()
。)ifsvaxew3#
strdup
为堆上的新字符串分配内存,而使用strcpy
(或其更安全的strncpy
变体)我可以将字符串复制到堆或堆栈上的预分配内存中。pieyvz9o4#
在accepted answer中,
strdup
的实现表示为:然而,这在某种程度上是次优的,因为
strlen
和strcpy
都需要通过检查每个字符是否是\0
来查找字符串的长度。使用
memcpy
应该会更有效率:qij5mzcb5#
char *strdup(char *pszSrch)
;strdup
将分配原始字符串大小的存储空间。如果存储空间分配成功,原始字符串将被复制到复制字符串。strdup
d失败时返回NULL
如果内存未分配,复制失败strdup
返回NULL
11dmarpk6#
对于 *memcpy,另一种没有dest和src增量实现是可能的:
while ( n-- ) { dest[n] = src[n] }