gpt4 book ai didi

c - strdup() - 它在 C 中的作用是什么?

转载 作者:太空狗 更新时间:2023-10-29 16:13:38 26 4
gpt4 key购买 nike

C 中 strdup() 函数的用途是什么?

最佳答案

确切地说,假设您习惯了 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
}

换句话说:

  1. 它会尝试分配足够的内存来容纳旧字符串(加上一个 '\0' 字符来标记字符串的结尾)。

  2. 如果分配失败,它设置errnoENOMEM并返回 NULL立即地。 errno的设置至 ENOMEM是什么malloc在 POSIX 中做所以我们不需要在我们的 strdup 中明确地做它.如果您 符合 POSIX,ISO C 实际上并不强制要求存在 ENOMEM。所以我没有在此处包含它(b)

  3. 否则分配有效,所以我们将旧字符串复制到新字符串(c) 并返回新地址(调用者负责在某个时候释放)。

请记住,这是概念上的定义。任何物有所值的库编写者都可能针对正在使用的特定处理器提供了高度优化的代码。

还有一件事要记住,看起来这个目前预定在标准的 C2x 迭代中,连同 strndup。 , 根据草稿 N2912文档。


(a) 但是,以 str 开头的函数和小写字母由标准保留用于 future 的方向。来自 C11 7.1.3 Reserved identifiers :

Each header declares or defines all identifiers listed in its associated sub-clause, and optionally declares or defines identifiers listed in its associated future library directions sub-clause.*

string.h 的 future 方向可以在 C11 7.31.13 String handling <string.h> 中找到:

Function names that begin with str, mem, or wcs and a lowercase letter may be added to the declarations in the <string.h> header.

因此,如果您想安全起见,您可能应该将其命名为其他名称。


(b) 更改基本上是替换 if (d == NULL) return NULL;与:

if (d == NULL) {
errno = ENOMEM;
return NULL;
}

(c) 请注意,我使用 strcpy因为那清楚地表明了意图。在某些实现中,使用 memcpy 可能更快(因为您已经知道长度) ,因为它们可能允许以更大的 block 或并行传输数据。或者它可能不会 :-) 优化口号 #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
}

关于c - strdup() - 它在 C 中的作用是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/252782/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com