【教学课件】第四章内存管理接口.ppt
第四章内存管理接口王兴隆一月 23本章内容malloccallocfreemmapmunmapmemsetmemcpymemmovememcmpmemchr内存控制内存控制内存操作内存操作malloc函数表头文件#include (或malloc.h)函数原型void*malloc(size_t size)函数功能配置内存空间函数输入malloc()用来配置内存空间,其大小由指定的size决定。函数返回值若配置成功则返回一指针,失败则返回NULL。相关函数calloc、freecalloc函数表头文件#include(或malloc.h)函数原型void*calloc(size_t nmemb,size_t size);函数功能配置内存空间函数输入calloc()用来配置nmemb个相邻的内存单位,每一单位的大小为size,并返回指向第一个元素的指针。在利用calloc()配置内存时会将内存内容初始化为0。函数返回值 若配置成功则返回一指针,失败则返回NULL。相关函数malloc,free free函数表头文件#include(或malloc.h)函数原型void free(void*ptr)函数功能释放原先配置内存空间函数输入参数ptr为指向先前由malloc()、calloc()返回的指针。返回值若配置成功则返回一指针,失败则返回NULL。相关函数malloc,calloc 范例4.1#include#includevoid main()int*pa;int*pb;int i;pa=(int*)malloc(sizeof(int)*5);if(pa=NULL)exit(1);for(i=0;i 5;i+)printf(“%d ”,pai);/继续 printf(“n%d”,pa);free(pa);printf(“%dn”,pa);pa=NULL;pb=(int*)calloc(5,sizeof(int);for(i=0;i 5;i+)printf(“%d ”,pbi);free(pb);pb=NULL;4.1运行结果mmap函数munmap函数表头文件#include#include函数原型 int munmap(void*start,size_t length);函数功能 取消内存映射函数输入 munmap()用来取消参数start所指的映射内存起始地址,参数length则是内存大小。当进程结束或利用exec相关函数来执行其它程序时,映射内存会自动解除。返回值如果解除映射成功返回0,否则返回1 相关函数 mmap范例4.2#include#include#include#include#include void main()/利用mmap()来读取文件内容 int fd;void*start;struct stat sb;fd=open(“/home/wxlong/OS/memory/test.txt”,O_RDONLY);/打开文件 fstat(fd,&sb);/获取文件大小 start=mmap(NULL,sb.st_size,PROT_READ,MAP_PRIVATE,fd,0);if(start=MAP_FAILED)/判断映射是否成功 return;printf(%s,start);munmap(start,sb.st_size);/解除映射 close(fd);memset函数表头文件#include函数原型 void*memset(void*s,int c,size_t n);函数功能 将一段内存空间填入某值 函数输入 memset()会将参数s所指的内存区域前n个字节以参数c填入,然后返回指向s的指针。返回值返回指向s的指针。特别说明 参数c虽声明为int,但必须是unsigned char,所以范围在0到255之间。范例4.3#include#include void main()char s5;memset(s,A,sizeof(s);s4=0;printf(%sn,s);输出结果:AAAAmemcpy函数表头文件#include函数原型 void*memcpy(void*dest,const void*src,size_t n);函数功能 拷贝内存内容函数输入 memcpy()用来拷贝src所指的内存内容前n个字节到dest所指的内存地址上。返回值返回指向dest的指针。特别说明 指针src和dest所指的内存区域不可重叠。memmove函数表头文件#include函数原型void*memmove(void*dest,const void*src,size_t n);函数功能拷贝内存内容函数输入memmove()与memcpy()作用相同,并且允许src和dest所指区域重叠,不过效率略慢。memcmp函数表头文件#include函数原型 int memcmp(const void*s1,const void*s2,size_t n);函数功能 字符串比较函数输入 memcmp()用来比较s1和s2所指的内存区间前n个字符。返回值若参数s1和s2所指的内存内容都完全相同则返回0值。s1的ASCII码序大于s2则返回大于0的值。s1若小于s2则返回小于0的值。memchr函数表头文件#include函数原型 void*memchr(const void*s,int c,size_t n);函数功能 字符查找函数输入 memchr()从头开始搜寻s所指的内存内容前n个字节,直到发现第一个值为c的字节,则返回指向该字节的指针。返回值如果找到指定的字节则返回该字节的指针,否则返回0。实验四C语言的realloc函数原型为void*realloc(void*p,int newsize),它可以对给定的指针所指的空间进行扩大或者缩小,其工作原理可简单描述为:1、realloc申请newsize大小的空间;2、将p中的信息拷贝到新申请的空间中;3、将p原来所指的空间释放4、返回新申请的空间的首地址;根据上述工作原理,编写my_realloc函数模拟realloc。注意:my_realloc函数的参数可能与realloc不同,请根据需要自己设计my_realloc的参数评价标准1、my_realloc需要完成如下功能:可以实现空间的扩大和缩小;失败时,返回NULL,原内存不发生改变;传入的指针为NULL时,相当于malloc函数;newsize=0时,相当于free函数。2、实际调用realloc函数时,若newsize比原指针所指空间小,则返回的指针与原指针地址相同;若newsize比原指针所指空间大,返回的指针也有可能与原指针地址相同,请解释原因?谢谢大家!谢谢大家!