- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
动态存储分配 一个简单的例子(sam01) malloc()和free() 程序的内存区域 calloc()和realloc() 再谈返回值为指针类型 上机安排 * 从前面我们所学的知识中,大家可以知道,定义了一个变量,系统就会自动在内存中根据变量的类型给它分配一定大小的存储空间。但这些都是系统自动完成的,即存储空间的分配与释放不需要程序员的干预。 在具体的程序设计中,往往需要程序员手工动态的去在内存中分配一块内存,这就是动态内存分配。这时存储空间的分配与释放都由程序员来完成。 #include stdio.h #include malloc.h int main(){ int size,i,*p; printf(Please input the size of array: ); scanf(%d,size); p = (int *)malloc(size*sizeof(int)); for(i=0;isize;i++) p[i] = i+1; for(i=0;isize;i++) printf(%d ,p[i]); free(p); } 在sam01中,我们使用了malloc()和free()两个函数,分别实现了内存的动态分配和释放,其函数原型如下: void *malloc( unsigned int size ); //p.278 void free( void *memblock ); //p.281 malloc()一定要与free()配对使用,否则会造成内存泄漏(memory leaks sam02)。 内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费。 在VC6.0中,涉及内存动态分配和释放的函数需使用头文件MALLOC.H。 在上面的程序中,有一个有趣的问题,malloc()函数的返值和free()函数的形参void *是什么类型? void *是无类型指针,因为malloc()和free()函数是通用的(即我们可能给int型,也可能给double型数据分配和释放内存),所以就需要一个没有任何类型的“通用”的指针(void *)! 另外malloc()函数在使用时,需将分配的内存强制转换为所需的类型。 代码区 (code area) 全局数据区:整个程序运行期间都有效。存放静态变量、全局变量等。 栈区:根据程序的需要动态分配,函数结束后被自动释放。存放各个函数中的数据,如:局部变量、形参、函数调用时的返回地址和现场保护等。 全局数据区 (data area) 堆区 (heap area) 栈区 (stack area) 代码区:存放程序的代码,即程序中各个函数的代码。 堆区:根据程序的需要动态分配,存放程序中的动态数据。 void *calloc( unsigned int num, unsigned int size ); //该函数用来分配num?size字节的内存空间。它的功能与malloc()基本类似,只不过使用calloc()分配的内存空间数据被初始化为0(p.279)。 void *realloc( void *memblock, size_t size ); //该函数用来将由memblock指向的已分配内存空间长度改变为size大小(p.280)。 在前面我们讲过:函数的返回值可以是指针,但并不是所有的指针都能返回,不能是具有局部作用域的指针。对于动态内存分配的空间,只要我们不主动释放,它在程序运行期间都是有效的,所以这样的指针可以作为函数返回值使用(sam03)。 大家切记:一定不能返回一个具有局部作用域的指针。 在主函数中实现如下功能:实现一个动态数组,数组的大小由用户输入。 编写一函数int * func(int n);该函数实现一个动态数组,其中参数n为数组大小,分配完的数组首地址作为返回值传回。在主函数中完成对该函数的调用。 完成求字符串逆串的函数。 完成实验六的内容。 习题1:将下列代码补充完整。 #include stdio.h #include malloc.h int main(){ int size,i,*phead,*pcur; scanf(%d,size); phead = pcur = (int *) ____ (size,sizeof(int)); for(i=0;isize;i++,pcur++) *pcur =_____; pcur = phead; for(i=0;isize;i++,pcur++) printf(%d ,_____);
文档评论(0)