- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
动态存储分配与释放 根据运行中的需要分配存储,取得存储块使用,称为动态存储分配。在运行中根据需要动态进行。 程序里怎样使用分配的存储块?程使用变量是通过名字。动态分配的存储块没有名字,因此需要其他访问途径。 借助于指针。用指针指向存储块,间接使用被指存储。访问动态分配存储是指针的最重要用途。 与此对应:动态释放,不用的动态存储块应交还。 动态分配/释放由动态存储管理系统完成,这是程序运行系统的子系统,管理着称作堆(英文heap)的存储区。 大部分常规语言都有这种机制。 C语言的动态存储管理机制 用标准库函数实现,stdlib.h/malloc.h 1)存储分配函数malloc()。原型: void *malloc(size_t n); /*size_t是某整型*/ 分配一块不小于n的存储,返回其地址。无法满足时返回空指针值。 int n; double *data; ... scanf(%d, n); data=(double*)malloc(n*sizeof(double)); if (data == NULL) { .... /* 分配未完成时的处理 */ } ..data[i]..*(data+j)../*正常处理*/ malloc的返回值(void*)应通过类型强制转为特定指针类型后赋给指针变量。 使用注意事项: 分配存储块大小应该用sizeof计算 动态分配必须检查成功与否 动态分配的块大小也是确定的。越界使用(尤其是越界赋值)是严重错误,可能导致程序或系统垮台 2)带计数和清0的存储分配函数calloc。原型: void *calloc(size_t n, size_t size); size是元素大小,n是个数。 分配一块存储,足够存n个大小为size的元素,并把元素全部清0;无法分配时返回空指针值。 前面的存储分配问题也可用下面语句实现: data = (double*)calloc(n, sizeof(double)); 主要差别:malloc对所分配的区域不做任何事情,calloc对整个区域自动清0。 3)动态存储释放函数free。原型: void free(void *p); free释放p指的存储块。注意: 该块必须是通过动态存储分配得到的 p值为空时什么也不做 执行free(p)后p值未变,被指块可能已变。不允许间接访问已释放存储块 不要对并非指向动态分配块的指针用本操作 为保证动态存储的有效使用,动态分配块不再用时应释放。动态存储块的释放只能通过调用free完成。 程序例子: int fun (...) {int *p;... p = (int *)malloc(...);...free(p); return ...; } /*退出函数前应释放函数内分配且已无用的动态存储*/ fun退出时p存在期结束,若没有访问分配块的其他途径,将不可能再用到函数里分配的存储块。 动态存储的流失。 如程序长期执行,存储流失就可能成为严重问题。对实际系统可能是很严重的问题。 4)分配调整函数realloc。函数原型是: void *realloc(void *p, size_t n); 更改已有分配。p指原分配块,n是新大小要求。 返回大小至少为n的存储块指针。新块与原块一致:新块小时保存原块n范围内数据;新块大时原数据存在,新增部分不初始化。分配成功后原块可能改变。 无法满足时返回空指针,原块不变。 常用写法(防止分配失败导致原存储块丢失) : q = (double*)realloc(p, m * sizeof(double)); if (q == NULL) { /*未成功,p仍指原块,特殊处理*/ } else { p = q; /* 令p指向新块,正常处理 */ ... } 例1:修改筛法程序,由命令行参数得到所需范围。如无命令行参数则要求用户输入确定范围的整数值。 先考虑整体设计。为了清晰,将筛法用函数实现。 命令行参数(字符串)需要转换到整数,定义函数: int s2int(const char *s); 函数实现(标准库有类似函数atoi): int s2int(const char *s) { int n; for (n = 0; isdigit(*s); ++s)n = 10 * n + (*s - 0); return n; } 筛法计算包装为函数: void sieve(int lim, int an[]) { int i, j, upb = sqrt(lim+1);an[0] = an[1] = 0; // 建立初始向量 for (i = 2; i = lim; ++i) an[i] = 1;for (i = 2; i = upb; +
您可能关注的文档
- 化学反应的速率1.pptx
- 化学教学法.ppt
- 化学与材料的制造应用.ppt
- PEP小学英语五年级下册说课稿(10页).doc
- 化学键与分子间作用力鲁科版高中化学一轮复习(配套doc练习).ppt
- PEP小学英语六上_Recycle_2_期末复习课件(阅读).ppt
- 化疗药物的毒性反应及防治wduo.ppt
- PEP小学英语六年级下册Unit3lesson1(阅读).ppt
- 勒柯布西耶大师分析.ppt
- 勤俭节约—文明从我做起主题班会.ppt
- PEP小学英语毕业总复习课件及练习3(阅读).ppt
- 北师大版unit19复习.ppt
- pep教材六年级上Unit4Ihaveapenpal第2课时的课件(阅读).ppt
- PEP新版三年级下册Unit2PartB_(阅读).ppt
- PEP版第八册unit3period5andperiod6课件(阅读).ppt
- PEP版小学英语五年级下册Unit_2_My_Favourite_Season__课件Lesson1(阅读).ppt
- period1Book7AUnits16中考英语教材知识点梳理以及重点句型讲解(阅读).ppt
- period20Book9Units1315中考英语教材知识点梳理以及重点句型讲解(阅读).ppt
- PerformanceManager培训课程1(阅读).ppt
- period5Book8AUnits13中考英语教材知识点梳理以及重点句型讲解(阅读).ppt
文档评论(0)