strdup()
C中函数的用途是什么?
究竟是什么样的,假设你已经习惯了C和UNIX分配单词的缩写方式,它会复制字符串 :-)
请记住,它实际上不是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 }
换一种说法:
它尝试分配足够的内存来保存旧字符串(加上'\ 0'字符来标记字符串的结尾).
如果分配失败,则设置errno
为ENOMEM
并NULL
立即返回.在POSIX中设置errno
to ENOMEM
是有效的malloc
,所以我们不需要在我们的中明确地执行它strdup
.如果你不符合POSIX标准,那么ISO C实际上并没有强制要求存在,ENOMEM
所以我没有把它包括在这里(b).
否则分配工作,所以我们将旧字符串复制到新字符串并返回新地址(调用者负责在某个时候释放).
请记住,这是概念性的定义.任何值得他们工资的图书馆作家都可能提供针对所使用的特定处理器的大量优化代码.
(a)但请注意,str
标准为未来指示保留以小写字母开头的函数和小写字母.来自C11 7.1.3 Reserved identifiers
:
每个标头声明或定义其关联子条款中列出的所有标识符,*可选地声明或定义其关联的未来库方向子条款中列出的标识符.**
未来的方向string.h
可以在C11 7.31.13 String handling
:
以
str
,mem
或wcs
小写字母开头的函数名称可以添加到标题中的声明中.
(b)改变基本上将取代if (d == NULL) return NULL;
:
if (d == NULL) { errno = ENOMEM; return NULL; }
char * strdup(const char * s) { size_t len = 1+strlen(s); char *p = malloc(len); return p ? memcpy(p, s, len) : NULL; }
也许代码比使用char 更快一些,strcpy()
因为\0
char不需要再次搜索(它已经存在strlen()
).
没有必要重复其他答案,但请注意,strdup()
从C角度来看,它可以做任何想做的事情,因为它不是任何C标准的一部分.但是它由POSIX.1-2001定义.
来自strdup man:
该strdup()
函数应返回一个指向新字符串的指针,该字符串是指向的字符串的副本s1
.返回的指针可以传递给free()
.如果无法创建新字符串,则返回空指针.