C语言中strdup()函数的目的是什么?


当前回答

没有必要重复其他答案,但请注意,从C的角度来看,strdup()可以做任何它想做的事情,因为它不是任何C标准的一部分。但是,POSIX.1-2001定义了它。

其他回答

Strdup()对包含结束字符'\0'的字符数组进行动态内存分配,并返回堆内存地址:

char *strdup (const char *s)
{
    char *p = malloc (strlen (s) + 1);   // allocate memory
    if (p != NULL)
        strcpy (p,s);                    // copy string
    return p;                            // return the memory
}

所以,它所做的是给我们另一个与它的参数所给出的字符串相同的字符串,而不需要我们分配内存。但我们仍然需要稍后释放它。

char * strdup(const char * s)
{
  size_t len = 1+strlen(s);
  char *p = malloc(len);

  return p ? memcpy(p, s, len) : NULL;
}

也许代码比strcpy()快一点,因为\0字符不需要再次搜索(它已经使用strlen())。

在POSIX兼容系统中,strdup和strndup被定义为:

char *strdup(const char *str);
char *strndup(const char *str, size_t len);

类的副本分配了足够的内存 String str,进行复制,并返回指向它的指针。

该指针随后可以用作free函数的参数。

如果可用内存不足,则返回NULL,并将errno设置为 ENOMEM。

strndup()函数从字符串str复制最多len个字符,总是null,终止复制的字符串。

来自strdup man:

strdup()函数将返回一个指向新字符串的指针,该指针是s1所指向的字符串的副本。返回的指针可以传递给free()。如果不能创建新的字符串,则返回空指针。

声明:

strcpy(ptr2, ptr1);

等价于(除了会改变指针):

while(*ptr2++ = *ptr1++);

而:

ptr2 = strdup(ptr1);

等价于:

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

所以,如果你想让你复制的字符串被用在另一个函数中(因为它是在堆部分创建的),你可以使用strdup,否则strcpy就足够了,