为什么内存函数,如memset,memchr …在string.h中,而不是在stdlib.h与另一个mem函数?

我想知道,为什么这样的function:
-memset
-memmov
-memchr
-memcpy

存在于string.h头文件中,但不存在于stdlib.h文件中,其中有其他标准的内存函数作为dynamic内存分配:malloc,calloc,realloc,free。

也许最好把它们合并成一个头文件? 你怎么看待这件事? 我不明白,为什么一组内存函数是分开的,并存在于string头(string.h)中。

因为实际上string.h被定义为一个标准的头文件,它声明了处理字符数组的函数,而不仅仅是string。 像memcpymemset这样的函数将参数视为指向字符数组types的对象的第一个元素的指针。

(C99,7.21.1p1)头文件<string.h>声明了一个types和几个函数,并且定义了一个用于处理字符types数组和其他被视为字符types数组的对象的macros。

我不会真的把string.h函数想象成“内存”函数。 相反,我会把它们看作是“数组”函数,因为它们对内存序列中包含的数据进行操作。 相比之下, malloc (和其他)实际上提供内存服务,如分配,而不是处理内存区域内的数据。

特别是, string.h的函数并不关心内存的任何分配或释放,或任何forms的内存pipe理。 即使像char * strerror(int)这样的函数似乎创build了一个全新的string,也不会执行任何分配,因为返回值实际上是一个静态分配的string。 其他函数可能会返回一个指向内存块的指针,但实际上这只是其中一个参数(例如memcpy )。 或者,它们返回一个指向子string( strtok )开始的指针,或者一个表示比较( memcmp )的整数。

另一方面, stdlib.h也不是真的关于内存。 stdlib.h的devise是提供大量程序可能需要的通用操作。 记忆function正好是这种基本操作的例子。 但是,其他function,如exitsystem也是很好的例子,但不适用于内存。

现在在stdlib.h有一些函数可以放在string.h ,特别是各种转换函数( mbstowcswcstombsatoistrtod等等),甚至是bsearchqsort函数。 这些函数遵循与string.h函数相同的原则(它们对数组进行操作,不返回新分配的内存块等)。

但是从实际的angular度来看,即使将mem*函数与mallocrealloccallocfree函数结合起来,C标准库也不会像这样重组。 这样的改变肯定会破坏代码。 此外, stdlib.hstring.h已经存在了很长时间,并且都是如此有用和基本的库,所以这些更改可能会破坏大部分(或者至less是很多)C代码。

在Pre-Standard C中,这些函数确实是在其他地方定义的,但是在stdlib.h和其他标准头文件中都没有,但是在memory.h 。 它仍然可能存在于你的系统上,它当然仍然在OS X上(截至今天)。

memory.h OS X 10.11(无许可证标题):

 #include <string.h> 

整个文件只有#include string.h ,以保持与Pre-Standard C程序的向后兼容性。