欢迎来到天天文库
浏览记录
ID:8970381
大小:36.50 KB
页数:4页
时间:2018-04-13
《c语言中动态内存申请与释放的简单理解》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、c语言中动态内存申请与释放的简单理解在C里,内存管理是通过专门的函数来实现的。与c++不同,在c++中是通过new、delete函数动态申请、释放内存的。1、分配内存malloc函数需要包含头文件:#include或#include函数声明(函数原型):void*malloc(intsize);说明:malloc向系统申请分配指定size个字节的内存空间。返回类型是void*类型。void*表示未确定类型的指针。C,C++规定,void*类型可以强制转换为任何其它类型的指针。从函数
2、声明上可以看出。malloc和new至少有两个不同:new返回指定类型的指针,并且可以自动计算所需要大小。比如:int*p;p=newint;//返回类型为int*类型(整数型指针),分配大小为sizeof(int);或: int*parr;parr=newint[100]; //返回类型为int*类型(整数型指针),分配大小为sizeof(int)*100;而malloc则必须由我们计算需要的字节数,并且在返回后强行转换为实际类型的指针。int*p;p=(int*) malloc(sizeof(int));第一、ma
3、lloc函数返回的是void*类型,如果你写成:p=malloc(sizeof(int));则程序无法通过编译,报错:“不能将void*赋值给int*类型变量”。所以必须通过(int*)来将强制转换。第二、函数的实参为sizeof(int),用于指明一个整型数据需要的大小。如果你写成:int*p=(int*)malloc(1);代码也能通过编译,但事实上只分配了1个字节大小的内存空间,当你往里头存入一个整数,就会有3个字节无家可归,而直接“住进邻居家”!造成的结果是后面的内存中原有数据内容全部被清空。 malloc也可
4、以达到new[]的效果,申请出一段连续的内存,方法无非是指定你所需要内存大小。 比如想分配100个int类型的空间: int*p=(int*)malloc(sizeof(int)*100);//分配可以放得下100个整数的内存空间。 另外有一点不能直接看出的区别是,malloc只管分配内存,并不能对所得的内存进行初始化,所以得到的一片新内存中,其值将是随机的。 除了分配及最后释放的方法不一样以外,通过malloc或new得到指针,在其它操作上保持一致。2、释放内存free函数需要包含头文件(和malloc一样):#in
5、clude或#include函数声明:voidfree(void*block);即:voidfree(指针变量);之所以把形参中的指针声明为void*,是因为free必须可以释放任意类型的指针,而任意类型的指针都可以转换为void*。 举例: int*p=(int*)malloc(4); *p=100; free(p);//释放p所指的内存空间 或者: int*p=(int*)malloc(sizeof(int)*100);//分配可以放得下100个整数的内存空间。 …… fre
6、e(p); free不管你的指针指向多大的空间,均可以正确地进行释放,这一点释放比delete/delete[]要方便。不过,必须注意,如果你在分配指针时,用的是new或new[],那么抱歉,当你在释放内存时,你并不能图方便而使用free来释放。反过来,你用malloc分配的内存,也不能用delete/delete[]来释放。一句话,new/delete、new[]/delete[]、malloc/free三对均需配套使用,不可混用! int*p=newint[100];......free(p); //ERROR!p
7、是由new所得。 这也是我们必须学习malloc与free的重要理由之一,有时候,我们调用操作系统的函数(WindowsAPI)时,会遇到由我们的程序来分配内存,API函数来释放内存;或API函数来分配内存,而我们的程序来负责释放,这时,必须用malloc或free来进行相应的工作。3、重调空间的大小:realloc函数需要包含头文件(和malloc一样):#include或#include 函数声明:void*realloc(void*block,intsize); block是
8、指向要扩张或缩小的内存空间的指针。size指定新的大小。 realloc可以对给定的指针所指的空间进行扩大或者缩小。size是新的目标大小。比如,原来空间大小是40个字节,现在可以将size指定为60,这样就扩张了20个字节;或者,将size指定为20,则等于将空间缩小了20个字节。 无论是扩张或是缩小,原有内存的中内容将保持不变
此文档下载收益归作者所有