一 概述:
本文描述的工具向程序员提供了高效的方式,对内存块进行复制、比较和设置。
在标准C中,这些函数被认为是字符串函数的一部分,在头文件string.h中进行声明。在标准C中,内存块是由void *类型的指针所指定的,内存被解释为unsigned char类型的对象数组。
二 函数:
1. memchr(可以参考strchr)
格式:void * memchr(const void *ptr,int val,size_t len);
功能:memchr函数在ptr的前len个字符中搜索val值的第一次出现。如果找到,返回一个指向包含val值的第一个字符的指针,否则返回一个null字符。
2 memcmp(可以参考strcmp)
格式:int memcmp(const void *ptr1,const void *ptr2,size_t len);
功能:memcmp函数把ptr1的前len个字符与ptr2的前len个字符进行比较。如果第一个字符串按字典顺序小于第二个字符串,返回一个负值;如果第一个字符串按字典顺序大于第二个字符串,就返回一个正值;如果两者相等,这个函数返回0.
3 memcpy和memmove(注意两个函数的实现)
格式: void *memcpy(void *dest,const void *src,size_t len);
void *memmove(void *dest,const void *src,size_t len);
共同点:都从src复制len个字符到dest,并返回dest的值。
区别:memmove在内存区域重叠的情况下也能正确的执行操作;如果源内存区域和目标内存区域重叠,memcpyd的行为是未定义的。如果两者都可用,可以认为memcpy更快些。
4 memset
格式:void *memset(void *ptr,int val,size_t len);
功能:memset函数把val复制到从ptr开始的len个字符中,返回ptr的值。
5 内存分配
函数列表:
#include<stdlib.h>
void *malloc(size_t size);
void *calloc(size_t elt_count,size_t elt_size);
void *realloc(void *ptr,size_t size);
void free(void *ptr);
malloc:
malloc函数分配一块内存,足以容纳一个大小(用sizeof操作符计算)为size的对象,这个函数返回指向这块区域的第一个元素的指针,并且无论目标对象是什么数据类型,它都保证实现了正确的对齐(因此,malloc分配的每块内存区都是对齐长度(通常是4或者8字节)的倍数);然后,函数调用者可以使用类型转换操作符把这个指针转换为其他类型的指针。如果由于某种原因无法执行所请求的分配,则返回一个null指针;如果所请求的内存大小为0,标准c版本要么返回一个null指针,要么返回一个不能用于访问对象的非null指针。
calloc:
calloc函数分配一块内存,这块内存足以容纳一个元素数量为elt_count、每个元素长度为elt_size(一般有sizeof得到)的数组,这块内存被逐位清除为0. 分配成功,则返回指向这块内存的第一个元素的指针;如果由于某些原因无法执行所请求的分配,或者elt_count或elt_size为0,则返回值与malloc相同。
realloc:
realloc函数接受一个指针为参数,这个指针指向一块以前有标准的内存分配函数所分配的内存区域,这个函数在保留这块内存区域的内容的情况下改变它的大小。成功的话,返回一个指向这块内存区域的指针;如果请求无法满足,则返回一个null指针,旧的内存区域不会受到影响。如果新的大小小于旧的大小,则旧内存区域尾部的部分会被丢弃;如果新的大小大于旧的大小,则所有的旧内容都被保留,并在尾部增加新空间,新增加的空间不会以任何方式进行初始化。
free:
free函数对以前由malloc、calloc或realloc所分配的一块内存区域进行销毁。free的参数必须是与某个内存分配函数的返回值相同的指针。如果参数是null指针,则调用这个函数不会产生任何效果。当一块内存被释放时,它就不能用于任何目的,使用指向这种内存区域的指针(成为“野指针”)将产生难以预料的后果;类似于多次释放同一个内存,也会产生意想不到的结果。
选自:C语言参考手册。