马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
当程序运行到需要一个动态分配的变量时,必须向系统申请取得堆中的一块所需大小的存储空间,用于存储该变量。当不再使用该变量时,也就是它生命结束时,要显示释放它所占用的存储空间,这样系统就能对该堆空间进行再次分配,做到重复使用有限的资源。 malloc函数 在C语言中,使用mallo函数来申请内存。函数原型如下: #include<stdlib.h> void 星号malloc(size_t size); 其中,参数size代表需要动态申请的内存的字节数。若内存申请成功,函数返回申请的内存的起始地址,若申请失败,返回NULL。使用该函数时,有下面几点要注意: (1)只关心申请内存的大小。该函数的参数,很简单,只有申请内存的大小,单位是字节。 (2)申请的是一块连续的内存。该函数一定是申请一块连续的区间,可能申请到的内存比实际申请的大。也有可能申请不到,若申请失败,返回NULL。一定要记得写出错判断。 (3)返回值类型是void 星号。函数的返回值是void星号,不是某种具体类型的指针。读者可以理解成,该函数只是申请内存,对在内存中存储什么类型的数据,没有要求。因此,返回值是void星号。在实际编程中,根据实际情况,将void 星号转换成所需要的指针类型。 (4)显示初始化。注意,堆区是不会自动在分配时做初始化的,所以程序需要显式的初始化。 free函数 在堆区上分配的内存,需要用free函数显示释放。函数原型如下: #include<stdlib.h> void free(void 星号ptr); 函数的参数ptr,指的是需要释放的内存的起始地址。该函数没有返回值。使用该函数,也有下面几点需要注意: (1)必须提供内存的起始地址。调用该函数时,必须提供内存的起始地址,不能提供部分地址,释放内存中的一部分是不允许的。因此,必须保存好malloc返回的指针值。若丢失,则所分配的堆空间无法回收,称内存泄露。 (2)malloc和free配对使用。编译器不负责动态内存的释放,需要程序员显示释放。因此malloc和free是配对使用的,避免内存泄露。 示例程序如下: #include <stdio.h> #include <stdlib.h> #include <string.h> int 星号get_memory(int n) { int星号p,i; if((p=(int星号)malloc(n 星号sizeof(int)))==NULL) { printf("mallocerror\n"); returnp; } memset(p,0,n星号sizeof(int)); for(i=0;i<n;i++) p=i+1;
returnp; } int main() { intn,星号p,i; printf("inputn:"); scanf("%d",&n); if((p=get_memory(n))==NULL) return0; for(i=0;i<n;i++) printf("%d",p); printf("\n");
free(p); p=NULL;
return0; } 该程序演示了动态内存的标准用法。动态内存的申请,通过一个指针函数来完成。内存申请时,判断是否申请成功,成功后,对内存初始化。在主调函数中,动态内存依然可以访问,不再访问内存时,用free函数释放。 (3)不允许重复释放。同一空间的重复释放也是危险的,因为该空间可能已另分配。 (4)free只能释放堆空间。像代码区、全局变量与静态变量区、栈区上的变量,都不需要程序员显示释放,这些区域上的空间,不能通过free函数来释放,否则执行时,会出错。 凌阳教育,全国唯一一家原厂式嵌入式培训机构,专业从事嵌入式人才培训13年,最近新开课程信息安全工程师培训,想了解更多嵌入式资料下载或者是凌阳教育的动态,请访问凌阳教育官网www.sunplusedu.com。
|