strcpy与strdup的比较

w80xi6nr  于 2022-12-03  发布在  其他
关注(0)|答案(6)|浏览(161)

我读到strcpy用于复制字符串,strdup返回一个指向新字符串的指针以复制该字符串。
您能解释一下您喜欢在哪些情况下使用strcpy,在哪些情况下使用strdup吗?

vptzau2j

vptzau2j1#

strcpy(ptr2, ptr1)相等while(*ptr2++ = *ptr1++)
其中strdup相当于

ptr2 = malloc(strlen(ptr1)+1);
strcpy(ptr2,ptr1);

memcpy version可能更有效)
所以如果你想把你复制的字符串用在另一个函数中(因为它是在heap部分创建的),你可以使用strdup,否则strcpy就足够了。

nfzehxib

nfzehxib2#

函数strcpystrncpy是C标准库的一部分,并且在现有内存上操作。也就是说,* 您 * 必须提供函数将字符串数据复制到其中的内存,作为推论,* 您 * 必须有自己的方法来找出您需要多少内存。
相比之下,strdup是一个Posix函数,它为你执行动态内存分配。它返回一个指针,指向它将字符串复制到的新分配的内存。但是 you 现在要对这个内存负责,最终必须free它。
这使得strdup成为“隐藏的malloc“便利函数之一,这大概也是它不属于标准库的原因。只要使用标准库,就知道必须为每个malloc/calloc调用一个free。但是像strdup这样的函数引入了一个隐藏的malloc,并且出于内存管理的目的,您必须将其视为malloc。(另一个这样的隐藏分配函数是愚者的abi::__cxa_demangle()。)

ifsvaxew

ifsvaxew3#

strdup为堆上的新字符串分配内存,而使用strcpy(或其更安全的strncpy变体)我可以将字符串复制到堆或堆栈上的预分配内存中。

pieyvz9o

pieyvz9o4#

accepted answer中,strdup的实现表示为:

ptr2 = malloc(strlen(ptr1)+1);
strcpy(ptr2,ptr1);

然而,这在某种程度上是次优的,因为strlenstrcpy都需要通过检查每个字符是否是\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);
}
qij5mzcb

qij5mzcb5#

char *strdup(char *pszSrch) ;
strdup将分配原始字符串大小的存储空间。如果存储空间分配成功,原始字符串将被复制到复制字符串。
strdup d失败时返回NULL如果内存未分配,复制失败strdup返回NULL

11dmarpk

11dmarpk6#

对于 *memcpy,另一种没有dest和src增量实现是可能的:
while ( n-- ) { dest[n] = src[n] }

相关问题