不在C标准中包含strdup的理由是什么?

大多数C程序员都熟悉strdup函数。 他们中的许多人会认为这是理所当然的,但它不是C标准的一部分(C89,C99和C11都不是)。 它是POSIX的一部分,可能并非在所有环境中都可用。 事实上,微软坚持将其重命名为_strdup ,这增加了混乱。

以这种方式定义它是相当容易的(在C中):

 #include  char *strdup(const char *s) { size_t size = strlen(s) + 1; char *p = malloc(size); if (p) { memcpy(p, s, size); } return p; } 

但即使是精明的程序员也很容易弄错。

此外,仅在没有它的系统上重新定义函数certificate有点复杂,如下所述: strdup()函数

为什么不在C标准的修订版中包含这些有用的广泛支持的function? 在C99的C标准库中添加了许多新function,不包括strdup的理由是什么?

评论中引用的链接( http://open-std.org/JTC1/SC22/WG14/www/docs/n718.htm )给出了关于在标准库中使用strdup的“错误”的解释:

主要问题是需要向标准库添加一个函数,该库为用户自动分配堆内存。

基本上,C语言及其标准库尽量不要假设用户如何分配和使用内存。
它提供了一些设施,其中包括堆栈和堆。

虽然malloc / free是动态内存分配的标准化,但它们绝不是唯一的方法,因为动态内存管理是一个非常复杂的主题,并且默认分配策略可能并不适用于所有类型的应用程序。

例如,一些独立的库,例如强调低碎片和并发性的jemalloc ,甚至是成熟的垃圾收集器,例如The Boehm-Demers-Weiser保守的垃圾收集器 。 这些库提供malloc / free实现,这些实现仅用于替换的标准* alloc和free函数,而不会破坏与C标准库其余部分的兼容性。

因此,如果strdup是标准的,那么它将被有效地取消使用第三方内存管理function的代码的使用(必须注意前面提到的jemalloc库确实提供了strdup的实现来避免这个问题)。

更一般地说,虽然strdup肯定是一个实用的function,但它的语义缺乏清晰度。 它是在头中声明的函数,但调用它需要通过从头中调用free函数来释放返回的缓冲区。 那么,它是字符串函数还是记忆函数?
将其保留在POSIX标准中似乎是避免使C标准库不太清晰的最合理的解决方案。