第13章 内存处理.pptx

  1. 1、本文档共20页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
C语言编程实战宝典大家好!!!第13章 内存处理13.1 动态存储分配C语言支持动态存储分配的,也就是在程序执行过程中来分配相应的内存单元。有了动态存储分配,就可以根据实际需要来设计大小可以变化的数据结构。13.1.1 内存分配函数有三个用于动态内存分配的函数,这些函数都是在stdlib.h头文件中声明的。(1)malloc函数:分配内存块,但不初始化分配的内存块。(2)calloc函数:分配内存块,并且对内存块进行清除。(3)realloc函数:调整之前已分配的内存块。13.2 动态分配字符串13.2.1 使用malloc()函数为字符串分配内存malloc()函数接受一个参数,该参数是 所需分配的内存单元数。给包含n个字符的字符串分配内存可以写 成:char *p;p=malloc(n+1);13.3 动态分配数组C语言中允许在程序执行期间为数组分配空间,并通过指向第一个数组元素的指针来访问数组。13.3.1 使用malloc()函数为数组分配内存可以使用malloc()函数来为数组分配存储空间。13.3.1 使用malloc()函数为数组分配内存使用malloc()函数来为数组分配存储空间与为字符串分配存储空间是类似的。不同之处在于数组的元素可以是各种类型,那么每个数组元素占有的字节数很可能是不同的,因此需要使用sizeof运算符来计算出每个数组元素所需要的空间数量。13.3.1 使用malloc()函数为数组分配内存在程序运行时可以使用malloc来请求一个内存块,当然还需要一个指针来存放该块在内存中的第一个单元的地址。例如: float *p; p=(float*) malloc(40 * sizeof (float));上面这段代码使用malloc申请了40个float类型的内存空间,并使用指针p指向该空间所在的位置。由于数组名是其第一个元素的地址,因此,如果令指针p指向一个内存块的第一个元素,就可以像使用数组名一样来使用它。也就是说,可以使用下标表达式p[0]来访问内存块的第一个元素,p[1]来访问第二个元素,依此类推。13.3.2 calloc()函数calloc在头文件stdlib.h中定义,其函数原型为:void * calloc(size_t nmemb, size_t size);calloc()函数为包含nmemb个元素的数组分配内存空间,其中每个元素都包含size个字节。如果请求空间失败,则函数返回空指针。在成功分配内存后,calloc()函数会将内存块中的所有位都置为0以完成初始化。13.3.3 realloc()函数realloc()函数的函数原型是在头文件stdlib.h中定义的,具体为:void * realloc(void *ptr, size_t size);在调用realloc()函数时,指针ptr必须已经指向了某个内存块,且此内存块必须是之前调用malloc()函数、calloc()函数或realloc()函数时分配的。参数size表示内存块的新尺寸,新尺寸既可能大于原有的内存块的尺寸也可能小于原有内存块的尺寸。13.4 释放存储malloc()函数以及其它内存分配函数所获得的内存块都来自内存中一块称为堆(heap)的区域。堆的容量是有限的,频繁调用内存分配函数则很容易就会耗尽堆中的内存,有时要求分配的内存区过大也可能会耗尽堆,一旦堆中的内存被耗尽,内存分配就失败了,函数的返回值就是空指针。13.4.1 free()函数free()函数在头文件stdlib.h中定义,其函数原型为:void free(void *ptr);调用free()函数时需要将不再使用的内存块的指针传递给free()函数。例如:p=malloc( …);q=malloc(…);free(p);p=q;在将q的值赋值给p以前,先使用free()函数释放掉p所指向的内存块,这样,该内存块就被堆回收了而可以再次被其它的内存分配函数使用。13.5 链表13.5.2 声明结点类型链表结点结构的定义:struct node{ int value; /*结点中存储的数据*/struct node *next; /*指向下一个结点的指针*/};成员next的类型是struct node,这表示它能够存储一个指向struct node类型结构体的指针。结点名node没有特殊的含义,它只是一个普通的结构体名。13.5.2 声明结点类型需要使用一个指针变量始终指向表中的第一个结点,这个指针称为头指针。头指针常命名为head,具体为:struct node *head=NULL;将head初始化为NULL表示链表初始状态为空。13.5.3 创建结点在构建链表时需要逐个创建链表的结点,并把每个生成的结点

文档评论(0)

文档精品 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:6203200221000001

1亿VIP精品文档

相关文档