凌阳教育专注嵌入式教育14年,良心教育,有担当,有诚信,值得信赖的教育品牌,欢迎访问官网#www.sunplusedu.com

动态内存的申请和释放

上一篇 / 下一篇  2016-04-05 16:26:16 / 个人分类:C语言

当程序运行到需要一个动态分配的变量时,必须向系统申请取得堆中的一块所需大小的存储空间,用于存储该变量。当不再使用该变量时,也就是它生命结束时,要显示释放它所占用的存储空间,这样系统就能对该堆空间进行再次分配,做到重复使用有限的资源。

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)mallocfree配对使用。编译器不负责动态内存的释放,需要程序员显示释放。因此mallocfree是配对使用的,避免内存泄露。

示例程序如下:

#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("malloc error\n");

              return p;

       }

       memset(p,0,n 星号 sizeof(int));

       for (i=0;i<n;i++)

              p[i]=i+1;

             

       return p;

}    

int main()

{

       int n,星号p,i;

       printf("input n:");

       scanf("%d",&n);

       if((p=get_memory(n))==NULL)

       return 0;

       for (i=0;i<n;i++)

              printf("%d",p[i]);

       printf("\n");

      

       free(p);

       p=NULL;

      

       return 0;

}    

该程序演示了动态内存的标准用法。动态内存的申请,通过一个指针函数来完成。内存申请时,判断是否申请成功,成功后,对内存初始化。在主调函数中,动态内存依然可以访问,不再访问内存时,用free函数释放。

(3)不允许重复释放。同一空间的重复释放也是危险的,因为该空间可能已另分配。

(4)free只能释放堆空间。像代码区、全局变量与静态变量区、栈区上的变量,都不需要程序员显示释放,这些区域上的空间,不能通过free函数来释放,否则执行时,会出错。

凌阳教育,全国唯一一家原厂式嵌入式培训机构,专业从事嵌入式人才培训13年,最近新开课程信息安全工程师培训,想了解更多嵌入式资料下载或者是凌阳教育的动态,请访问凌阳教育官网www.sunplusedu.com


TAG: 动态

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar