为什么内存函数,如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。 像memcpy
和memset
这样的函数将参数视为指向字符数组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,如exit
和system
也是很好的例子,但不适用于内存。
现在在stdlib.h
有一些函数可以放在string.h
,特别是各种转换函数( mbstowcs
, wcstombs
, atoi
, strtod
等等),甚至是bsearch
和qsort
函数。 这些函数遵循与string.h
函数相同的原则(它们对数组进行操作,不返回新分配的内存块等)。
但是从实际的angular度来看,即使将mem*
函数与malloc
, realloc
, calloc
和free
函数结合起来,C标准库也不会像这样重组。 这样的改变肯定会破坏代码。 此外, stdlib.h
和string.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程序的向后兼容性。