【发布时间】:2015-10-05 08:41:44
【问题描述】:
大多数 C 程序员都熟悉 strdup 函数。他们中的许多人会认为这是理所当然的,但它不是 C 标准的一部分(C89、C99 和 C11 都不是)。它是 POSIX 的一部分,可能并非在所有环境中都可用。事实上,微软坚持将其重命名为_strdup,这增加了混乱。
用这种方式定义它相当容易(在 C 中):
#include <string.h>
char *strdup(const char *s) {
size_t size = strlen(s) + 1;
char *p = malloc(size);
if (p) {
memcpy(p, s, size);
}
return p;
}
但即使是精明的程序员也很容易出错。
此外,仅在没有该功能的系统上重新定义该功能证明有点复杂,如下所述:strdup() function
为什么不在 C 标准的修订版中包含这些广泛支持的有用功能? C99的C标准库中增加了很多新函数,不包括strdup的原因是什么?
【问题讨论】:
-
@AlterMann:
malloc和朋友一直是 C 标准的一部分。aligned_alloc是在 C11 中添加的,malloc在 C11 标准的 11 页中提到,你能解释一下你的意思吗? -
@AlterMann:不是每个人都在为嵌入式系统编程。如果本地规则禁止通过
malloc分配内存,他们显然也应该禁止strdup。 -
很遗憾C语言的进化是由这么小的4个人决定的,其中一半似乎并不在意。
-
@JensGustedt 我认为他的意思是如果我们同时添加
strdup和aprintf,那么就不能再争论strdup将是唯一不以@ 结尾的函数987654336@ 需要free获得结果