在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
芯片精品文章合集(500篇!) 创芯人才网--重磅上线啦!
查看: 1336|回复: 0

[资料] 动态内存的申请和释放

[复制链接]
发表于 2016-4-5 16:25:16 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

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)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("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


您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条


小黑屋| 手机版| 关于我们| 联系我们| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2025-1-9 23:05 , Processed in 0.014512 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表