当前位置    :     网站首页    /     手机 > 详情页

malloc函数的返回值是什 如何正确使用malloc函数分配内存

2022-12-01 13:53:21来源:时代新闻网

内存泄漏的原因

2.1 C语言内存分配情况

在C语言中,根据数据在内存中存在的时间(生存周期)不同,将内存空间分为三个区:

1)程序区:用于存储程序的代码,即程序的二进制代码。

2)静态存储区:用于存储全局变量和静态变量,这些变量的空间在程序编译时就已经分配好了。

3)动态存储区:用于在程序执行时分配的内存,又分为:堆区(heap)和栈区(stack)。堆区:用于动态内存 分配,程序运行时由内存分配函数在堆上分配内存。在C语言中,只能使用指针才能动态的分配内存。栈区:在 函数执行时,函数内部的局部变量和函数参数的存储单元的内存区域,函数运行结束时,这些内存区域会自动释 放。

2.2 C语言动态内存分配

在C语言中用内存分配函数来实现内存的动态分配,这些函数有:malloc()和realloc()等函数。malloc():使用这个 函数时需要包含头文件。使用该函数需要指定要分配的内存字节数作为参数,例如:

int *pNumber=(int *) malloc(100)

这条语句分配了100个字节的内存,并把这个内存块的地址赋给pNumber,这个内存块可以保存最大25个int值, 每个int占4个字节。如果不能分配请求的内存,malloc()会返回一个null指针。

2.3 释放动态分配的内存

堆上分配的内存会在整个应用程序结束之后,由操作系统负责回收,但最好是在使用完这些内存后立即释放。如 果不释放,会引起内存泄漏,极大占用系统资源,可能会产生各种未知的错误。所以,必须使用free()函数释 放内存,参数是内存地址(指针),例如:free(pNumber),依上例。

(3)内存泄漏避免的方法

3.1正确使用malloc函数分配内存

malloc是一个函数,专门用来从堆上分配内存。使用malloc函数需要几个要求:内存分配给谁?分配多大内存? 是否还有足够内存分配? 内存将用来存储什么格式的数据?分配好的内存在哪里? 如果这5点都确定,那内存就 能分配。下面看看malloc的原型:(void *)malloc(int size)

malloc函数的返回值是一个void类型的指针,参数为int类型的数据,即申请分配的内存大小,单位是字节。内存 分配成功之后,malloc函数返回这块内存的首地址,你需要一个指针来接受这个地址。也就是说这块内存将来要 用来存储什么类型的数据,如:

char *p = (char *)malloc(100)

在堆内存分配了100个字节的内存,返回这块内存的首地址,把地址强制转换成char *类型后赋给char *类型的指 针变量p;同时告诉我们这块内存将用来存储char类型的数据。你只能通过指针变量p来操作这块内存,这块内存 本身没有名字,对它的访问是匿名访问。但是,不一定每次malloc函数都能成功分配到内存。既然malloc函数申 请内存存在不成功的可能,那我们在使用指向这块内存的指针时,必须用if( NULL != p)语句上来验证内存分 配确实成功了。

3.2 正确使用free函数释放内存

既然有分配,那就必须有释放,不然的话,有限的内存就会用光,而没有释放的内存却占用空间,与malloc对应 的就是free函数了。free函数只有一个参数,就是所要释放的内存块的首地址(指针)。按上例,则 为:free§.free函数其实它就做了一件事:斩断指针变量和这块内存的对应关系。free函数就是把这块内存和p 之间的关系斩断;p本身的值并没有改变或者消失,即指针变量p本身保存的地址并没有改变,那块被释放的内存 里面保存的值也没有改变。这就是free函数的功能,一个malloc对应一个free,是一夫一妻制。在使用free(p) 函数内存释放后,指针变量p本身保存的地址并没有改变,那我们必须需重新把p的值变为NULL:p = NULL。如 果没有把该指针置NULL,这个指针就成为了“悬空指针”,这是很危险的,且也是经常出错的地方。

标签: C语言malloc函数的功能及用法 malloc函数的返回值 如何正确使用malloc函数分配内存 内存泄漏避免的方法 malloc函数的应用 释放动态分配的内存 内存泄漏的原因 C语言内存分配情况 C语言动态内存分配 静态存储区 什么是程序区

电脑

硬件

电竞

数码

四川省攀枝花市委政法委原书记谢忠华被查 疫情关注|安阳市汤阴县告急!中国电信连夜出征 河南19个高速服务区可核酸检测:40元/人,2个小时出结果 【海报】上班防疫 必备指南 郑州金域一区域负责人违反传染病防治法被刑事立案侦查,郑州金域:公司会全力配合警方调查
产品

一次查清,河南高速服务区19个快速核酸检测点!

全国疫情最新消息|1月12日新增确诊190例 河南新增76例本土确诊 天津新增41例本土确诊

获奖啦!金水发布荣获“2021年度中国优秀政务新媒体”

【央视联播关注河南】积极落实防控措施 严控疫情

判决生效执行难 河南一公司账户冻结后仍有千万元资金流出