为什么memset,memchr等内存函数在string.h中,而在stdlib.h中却没有其他mem函数?

49 c memory header function

我想知道,为什么这样的功能如下:
-memset
-memmov
-memchr
-memcpy

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

也许最好将它们合并在一个标题中?你怎么看待这件事?我不明白,为什么一组内存函数与其他函数分离并存在于字符串头(string.h)中.

oua*_*uah 36

因为实际上string.h被定义为标准头,它声明了处理字符数组而不仅仅是字符串的函数.函数like memcpymemsettake参数被视为指向字符数组类型的对象的第一个元素的指针.

(C99,7.21.1p1)头文件<string.h>的声明的一种类型和多种功能,并且定义一个宏用于操纵字符类型和作为字符类型的数组治疗的其他对象的数组是有用的.

  • 但像memset,memchr,memmov,memcpy这样的方法与void*类型一起工作,而且真的更多的工作内存不是char,我是对的吗? (2认同)
  • 您可以传递任何对象指针类型,但实际上数组元素被解释为它们具有"unsigned char"类型.(C99,7.21.1p3) (2认同)
  • 另外关于“void *”,请注意,在 K&amp;R C(标准 C 之前)中,没有“void”类型,并且“memcpy”和“memset”等函数的参数是“char *”类型而不是“void” *`。 (2认同)

Ken*_*nde 11

我不会将这些string.h功能视为"记忆"功能.相反,我会将它们视为"数组"函数,因为它们对包含在内存序列中的数据进行操作.相比之下,malloc(和其他人)实际上提供了诸如分配之类的存储器服务,而不是在存储器区域内操纵数据.

特别是,其中的函数string.h不处理任何内存的分配或释放,或任何形式的内存管理.即使是一个char * strerror(int)似乎创建一个全新字符串的函数也不会进行任何分配,因为返回值实际上是一个静态分配的字符串.其他函数可能返回指向内存块的指针,但这实际上只是它们的一个参数(例如memcpy).或者它们返回指向子字符串(strtok)开头的指针,或表示比较(memcmp)的整数.

另一方面,stdlib.h也不是真的关于记忆.设计stdlib.h是为了提供大量程序可能需要的通用操作.记忆功能恰好是这种基本操作的例子.但是,其他功能类似exit并且system也是很好的例子,但不适用于内存.

现在也有一些功能在stdlib.h其中IMO可能已被放置在string.h,特别是各种转换函数(mbstowcs,wcstombs,atoi,strtod,等等),并且甚至可能是bsearchqsort功能.这些函数遵循与函数相同的原理string.h(它们在数组上运行,不返回新分配的内存块等).

但是,从实际的角度来看,即使做了很多的意义的结合mem*功能与malloc,realloc,callocfree函数,C标准库是永远要进行重组这样.这样的改变肯定会打破代码.此外,stdlib.h并且string.h已经存在了很长时间,并且都是如此有用和基础的库,这些更改可能会破坏大多数(或至少很多)C代码.