对c语言中malloc和free函数的理解
最近在复习c语言的时候再次用到了malloc函数和free函数,此处着讲解一下自己对这两个函数的理解和认识。
一. malloc函数和free函数的基本概念和基本的用法
对于malloc函数:
1. 包含的头文件:<mallloc.h> 或者<stdlib.h>
2. 函数的原型:void *malloc(unsigned int NumBytes);
3. 函数功能: 该函数分配了NumBytes个字节的内存空间,如果成功,则返回指向这块内存的指针(即这块存储区域的首地址)。如果分配失败,则返回一个空指针(NULL)(分配失败的原因往往有多种,例如内存空间不足)。
对于free函数:
1.包含的头文件:同malloc函数
2.函数原型 void free(void *ptr);
该函数无返回值。
3.函数功能:该函数通常与malloc在一起使用,用于释放malloc函数分配的内存空间。
函数用法示例:
#include<stdlib.h>
#include <stdio.h>
int main()
{
int *p;
int i = 2;
p = (int*)malloc(sizeof(int));
if(p)
{
printf("p的地址为%x!",p); } else
{
printf("分配失败!"); }
free(p); }
二.更具体的解释
对于malloc函数,其返回值的类型是void*,而void*在c语言中仅仅是用于存储地址,若对其进行赋值运算必须进行强制类型转换(void*可以转化成任意的指针类型)。一般使用完malloc函数后需要对其返回值进行检测,检测是否为空指针。分配成功后变量就获得相应的内存空间,至于内存空间是否是连续的是由操作系统所决定的;编译器只是向操作系统申请内存空间,具体如何分内存空间还是由操作系统来决定。
而对于free函数,它释放了由malloc函数所分配的内存空间。那么,如何理解此处的"释放"呢?实际上malloc函数就是给指针一个合法的地址,并且该地址指向一个合法的内存空间。而对指针进行free后,之前分配的内存空间就"自由了",即该内存空间又可以重新被操作系统所分配(既可能分配给本程序,也可能分配给其他程序);而free后的指针仍然存在,其值还是刚刚分配的内存空间的地址,并不是0(并不是NULL)。所以free之后,通常要手动的将指针设置为NULL。此处可见下面的一个例子:
#include<stdlib.h>
#include <stdio.h>
int main()
{
int *p;
int i = 2;
p = (int*)malloc(sizeof(int));
if(p)
{
printf("p的地址为%x!",p);
free(p);
printf("free后p的地址为%x!",p); } }
运行后,会发现两次输出的p的地址是相同的。至于free后的p所指向的值,既可能改变了,也可能没改变,因为它已经不受本程序控制,而由操作系统来决定;如果操作系统将其分给某个程序,且该程序给变了其值,那么它的值就变了。总结一下free函数,可简述为以下几点:
1.free只是释放了malloc所申请的内存,并不改变指针的值;
2.由于指针所指向的内存已经被释放,所以其它代码有机会改写其中的内容,相当于该指针从此指向了自己无法控制的地方,也称为野指针;
3.为了避免失误,最好在free之后,将指针指向NULL。
4.malloc后必须free,否则会造成内存泄漏。
最后,对于由malloc函数分配空间的变量,它们往往存储在堆里(是*p不是p,p作为变量的地址还是存在栈里),而不是栈中,这点要注意。malloc申请的内存空间,也是从堆中申请,这样申请后的指针,就指向了堆中的某块内存。
对c语言中malloc和free函数的理解的更多相关文章
- ZH奶酪:C语言中malloc()和free()函数解析
1.malloc()和free()的基本介绍 (1)函数原型及说明 void *malloc(long NumBytes) 该函数分配了NumBytes个字节,并返回了指向这块内存的指针.如果分配失败 ...
- C语言中malloc()和calloc()c函数用法
C语言中malloc()和calloc()c函数用法 函数malloc()和calloc()都可以用来动态分配内存空间,但两者稍有区别. malloc()函数有一个参数,即要分配的内存空间的大小: ...
- C语言中malloc函数返回值是否需要类型强制转换问题
1. 在C语言中, 如果调用的函数没有函数原型, 则其返回值将默认为 int 型. 考虑调用malloc函数时忘记了 #include <stdlib.h>的情况 此时malloc函数返回 ...
- C语言中malloc函数的理解
在C语言中malloc函数主要是用在堆内存的申请上,使用malloc函数时,函数会返回一个void *类型的值,这个值就是你申请的堆内存的首地址:为什么返回的地址是一个void *类型的地址呢?首先我 ...
- C语言中malloc函数的使用方法
C语言中malloc是动态内存分配函数.函数原型:void *malloc(unsigned int num_bytes);参数:num_bytes 是无符号整型,用于表示分配的字节数.返回值:如果分 ...
- C语言中getopt()和getopt_long()函数的用法
一.参考文章 1.C语言中getopt()和getopt_long()函数的用法 2.linux 中解析命令行参数 (getopt_long用法) 二.调试经验
- C语言中 malloc函数用法
一.malloc()和free()的基本概念以及基本用法: 1.函数原型及说明: void *malloc(long NumBytes):该函数分配了NumBytes个字节,并返回了指向这块内存的指针 ...
- C 语言中 malloc、calloc、realloc 和free 函数的使用方法
C标准函数库中,常见的堆上内存管理函数有malloc(), calloc(), recalloc(), free(). 之所以使用堆,是因为栈只能用来保存临时变量.局部变量和函数参数.在函数返回时,自 ...
- C语言中 malloc
参考:https://blog.csdn.net/kokodudu/article/details/11760863 一.malloc()和free()的基本概念以及基本用法: 1.函数原型及说明: ...
随机推荐
- Python 学习记录----利用Python绘制奥运五环
import turtle #导入turtle模块 turtle.color("blue") #定义颜色 turtle.penup() #penup和pendown()设置画笔抬起 ...
- DIPHA
https://github.com/DIPHA/dipha http://www.rkwitt.org/blog/topological_machine_learning.html 一.预装软件 1 ...
- 小学生四则运算出题程序 无操作界面java版 简单的运用java中一些基本操作
这是本学期java课中实验大纲里的第一个实验,这里简单做了一个无用户界面版本. import java.util.Random; import java.util.Scanner; public cl ...
- ubuntu 安装Django MySQL
1.安装步骤 我到公司的第一件事就是安装ubuntu系统,虽然我以前没有接触过ubuntu系统不过在网上找了一下资料感觉和安装其它系统也差不多(注:我是安装带图形界面的那个版本),还是比较轻松的搞定了 ...
- MVC 知识点学习2
1._Layout.cshtml @RenderBody() 2.自定义扩展HtmlHelper(需要添加Bootstrap.js或者Bootstrap.min.js文件到项目中) namespa ...
- css3 视距-perspective
视距-用来设置用户与元素3d空间Z平面之间的距离. 实例1: HTML: <div class="perspective"> <h3&g ...
- 如何使用Python3.4连接MySQL
http://www.tuicool.com/articles/yqayEv import pymysql conn = pymysql.connect(host='localhost', port= ...
- Deactivate .NET refector
8.5版本用注册机注册时手快成Standed版本,搞错......,能否Deactivated,发现要联网..... 接下来查找.net reflector 在位置%UserProfile%\AppD ...
- js 文本框只能输入数字
<input type="text" value="" style="ime-mode:Disabled" onkeyup=&quo ...
- IOS OC 多任务定时器 NSRunLoop 管理 NSTimer
下面有两种做法 1.使用日期组件 NSDateComponents 2.使用NSString 生成一个日期 // 创建一个日历对象 NSCalendar *calendar = [NSCalenda ...