strdup()
函数在C语言中的目的是什么?
如果你已经习惯了C和UNIX缩写单词的方式,那么这是一个非常直接的东西,它可以复制字符串 :-)
请注意,实际上它并不是当前(C17)ISO C标准的一部分(a)(这是POSIX的事情),它实际上执行的与下面的代码相同:
char *strdup(const char *src) {
char *dst = malloc(strlen (src) + 1); // Space for length plus nul
if (dst == NULL) return NULL; // No memory
strcpy(dst, src); // Copy the characters
return dst; // Return the new string
}
换句话说:if (d == NULL) {
errno = ENOMEM;
return NULL;
}
(c)请注意我使用strcpy
,因为它清晰地显示了意图。在某些实现中,使用memcpy
可能会更快(因为您已经知道长度),因为它们可以允许以较大的块或并行传输数据。或者也可能不会更快 :-) 优化法则#1:“测量,而不是猜测”。
无论如何,如果您决定走这条路线,您需要执行以下操作:
char *strdup(const char *src) {
size_t len = strlen(src) + 1; // String plus '\0'
char *dst = malloc(len); // Allocate space
if (dst == NULL) return NULL; // No memory
memcpy (dst, src, len); // Copy the block
return dst; // Return the new string
}
{ EDOM,EILSEQ,ERANGE }
作为必需的错误代码。已更新答案以解决此问题。 - paxdiablochar * strdup(const char * s)
{
size_t len = 1+strlen(s);
char *p = malloc(len);
return p ? memcpy(p, s, len) : NULL;
}
由于\0
字符已经被strlen()
搜索过了,因此这段代码可能会比使用strcpy()
稍微快一点。
return memcpy(malloc(len), s, len);
因为我更喜欢在分配时崩溃而不是在分配失败时返回NULL
。 - Patrick SchlüterNULL
并不一定会崩溃;它是未定义的。如果你想确保它崩溃,可以编写一个调用abort
的emalloc
。 - Daveemalloc
的习惯,这样当你在其他平台编写代码时就会使用它。 - ArtOfWarfare不必重复其他答案,但请注意,strdup()
从C语言的角度来看可以执行任何操作,因为它不是任何C标准的一部分。然而,它确实由POSIX.1-2001定义。
strdup()
是可移植的吗?不是,在非POSIX环境中不可用(但可以轻松实现)。但是,仅仅因为一个函数是POSIX函数,并不能说明它能做任何事情。POSIX是另一个标准,与C语言一样好甚至更受欢迎。 - P.Pstrdup
函数。在这样的实现中,不能保证 strdup
的行为方式与 POSIX 函数相同。我不知道是否有这样的实现,但是一个合法的非恶意实现可能出于历史原因提供 char *strdup(char *)
,并拒绝尝试传递 const char *
。 - user743382strdup()函数是为字符数组做动态内存分配,包括结束字符'\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
}
因此,它会给我们提供另一个与其参数相同的字符串,而无需分配内存。但是我们仍然需要稍后释放它。
strdup
和strndup
在符合POSIX标准的系统中定义为:
char *strdup(const char *str);
char *strndup(const char *str, size_t len);
strdup()函数会为字符串str
分配足够的内存,将其复制并返回指向该副本的指针。free
函数的参数。NULL
并将errno
设置为ENOMEM
。
strndup()函数从字符串str
中最多复制len
个字符,并始终以空字符终止复制的字符串。这个函数通过运行malloc和strcpy复制传入的字符串,然后返回malloc分配的缓冲区给调用者,因此需要对返回值运行free。
这个语句是:
strcpy(ptr2, ptr1);
等价于(除了这会改变指针):
while(*ptr2++ = *ptr1++);
鉴于:
ptr2 = strdup(ptr1);
等同于:
ptr2 = malloc(strlen(ptr1) + 1);
if (ptr2 != NULL) strcpy(ptr2, ptr1);
strdup
,否则strcpy
就足够了。strdup()函数是字符串复制的简写形式,它接受一个参数作为字符串常量或字符串字面值,并分配足够的空间来存储该字符串,并将相应的字符写入分配的空间,最后将分配的空间地址返回给调用程序。
strdup
函数的参数不需要是字符串常量,它必须是C字符串,即以null结尾的char
数组。 - chqrlie
strdupa
很危险,除非您已确定strlen
很小,否则不应使用。但是,这时您可以在栈上使用固定大小的数组来代替。 - R.. GitHub STOP HELPING ICE