pax*_*blo 360
究竟是什么样的,假设你已经习惯了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
}
Run Code Online (Sandbox Code Playgroud)
换一种说法:
它尝试分配足够的内存来保存旧字符串(加上'\ 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 <string.h>
:
以
str
,mem
或wcs
小写字母开头的函数名称可以添加到<string.h>
标题中的声明中.
(b)改变基本上将取代if (d == NULL) return NULL;
:
if (d == NULL) {
errno = ENOMEM;
return NULL;
}
Run Code Online (Sandbox Code Playgroud)
Pat*_*ter 85
char * strdup(const char * s)
{
size_t len = 1+strlen(s);
char *p = malloc(len);
return p ? memcpy(p, s, len) : NULL;
}
Run Code Online (Sandbox Code Playgroud)
也许代码比使用char 更快一些,strcpy()
因为\0
char不需要再次搜索(它已经存在strlen()
).
Chr*_*ung 51
没有必要重复其他答案,但请注意,strdup()
从C角度来看,它可以做任何想做的事情,因为它不是任何C标准的一部分.但是它由POSIX.1-2001定义.
Von*_*onC 17
来自strdup man:
该strdup()
函数应返回一个指向新字符串的指针,该字符串是指向的字符串的副本s1
.返回的指针可以传递给free()
.如果无法创建新字符串,则返回空指针.
小智 5
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
}
Run Code Online (Sandbox Code Playgroud)
因此,它的作用是为我们提供另一个与其参数给出的字符串相同的字符串,而不需要我们分配内存。但稍后我们仍然需要释放它。
strdup
strndup
在 POSIX 兼容系统中定义为:
char *strdup(const char *str);
char *strndup(const char *str, size_t len);
Run Code Online (Sandbox Code Playgroud)
strdup ()函数为字符串的副本分配足够的内存str
,进行复制,并返回指向它的指针。
该指针随后可以用作函数的参数free
。
如果可用内存不足,NULL
则返回并errno
设置为
ENOMEM
。
strndup ()len
函数从字符串中复制最多字符str
,始终以 null 终止复制的字符串。
归档时间: |
|
查看次数: |
382763 次 |
最近记录: |