最近在复习c语言的时候再次用到了malloc函数和free函数,此处着讲解一下自己对这两个函数的理解和认识。

一. malloc函数和free函数的基本概念和基本的用法

对于malloc函数:

1.包含的头文件: 或者

2. 函数的原型:void *malloc(unsigned int NumBytes);

3. 函数功能: 该函数分配了NumBytes个字节的内存空间,如果成功,则返回指向这块内存的指针。如果分配失败,则返回一个空指针(NULL)(分配失败的原因往往有多种,例如内存空间不足)。

对于free函数:

1.包含的头文件:同malloc函数

2.函数原型 void free(void *ptr);

该函数无返回值。

3.函数功能:该函数通常与malloc在一起使用,用于释放malloc函数分配的内存空间。

函数用法示例:

#include

#include

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

#include

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函数分配空间的变量,它们往往存储在堆里,而不是栈中,这点要注意。malloc申请的内存空间,也是从堆中申请,这样申请后的指针,就指向了堆中的某块内存。

原文:http://www.cnblogs.com/wangkundentisy/p/6002448.html

c语言free函数的作用,c语言中free函数的理解相关推荐

  1. c语言time函数的作用,c语言中time函数的用法

    c语言中time函数的用法 c语言中time函数的用法的用法你知道吗?下面应届毕业生小编就跟你们详细介绍下c语言中time函数的用法的用法,希望对你们有用. c语言中time函数的用法的用法如下: 头 ...

  2. 在c语言中log函数的作用,C语言中log函数怎么使用啊

    优质回答 回答者:奔跑的五花肉11 1.C语言中,有两个log函数,分别为log10和log函数,具体用法如下: 2.函数名: log10 功 能: 对数函数log,以10为底 用 法: double ...

  3. c语言pow函数的作用,c语言中pow函数的用法是什么?_后端开发

    在c言语中pow()函数是用来求x的y次幂.x.y及函数值都是double型 ,其语法为"double pow(double x, double y)":个中参数"dou ...

  4. exit在c语言里的作用,C语言中exit函数的使用

    exit() 结束当前进程/当前程序/,在整个程序中,只要调用 exit ,就结束 return() 是当前函数返回,当然如果是在主函数main, 自然也就结束当前进程了,如果不是,那就是退回上一层调 ...

  5. C语言一定要有函数声明吗,1 什么是C语言的隐式函数声明在C语言中,函数在调用前不一定非要声明。如果没有声明,那么编译器会自动按照一种隐式声明的规则,为调用函数的C代码产生汇编代码。下...

    1 什么是C语言的隐式函数声明 在C语言中,函数在调用前不一定非要声明.如果没有声明,那么编译器会自动按照一种隐式声明的规则,为调用函数的C代码产生汇编代码.下面是一个例子: int main(int ...

  6. c语言中rand()的作用,c语言中rand()函数怎么用? rand函数的用法

    导航:网站首页 > c语言中rand()函数怎么用? rand函数的用法 c语言中rand()函数怎么用? rand函数的用法 相关问题: 匿名网友: rand(产生随机数) 相关函数 sran ...

  7. c语言fgetc函数作用,C语言中fgetc函数的使用方法

    该函数包含在C语言中的stdio.h头文件中,主要功能是从流中读取一个字符,并增加文件指针的位置. 函数原型:int fgetc(FILE *fp); 函数功能:从流中读取字符,即从fp所指定的文件中 ...

  8. c语言中argc的作用,C语言中main函数的参数argc和argv

    参考资料: C++语言中的main函数,经常带有参数argc,argv,如下: int main(int argc, char** argv) int main(int argc, char* arg ...

  9. java中flush函数作用_Java语言中flush()函数作用及使用方法详解

    最近在学习io流,发现每次都会出现flush()函数,查了一下其作用,起作用主要如下 //------–flush()的作用--------– 笼统且错误的回答: 缓冲区中的数据保存直到缓冲区满后才写 ...

最新文章

  1. asp.net中将Excel文件(.xls)绑定到DataGrid
  2. git初始化及关联远程仓库命令
  3. 计算机地址码特点,电脑摇头灯的地址码的设定问题你必须要注意的
  4. 8. Dropout and Strides For Larger Models
  5. Vue CLI 安装
  6. NOIP1996复赛 普及组 第二题 python
  7. 【ES6(2015)】新的声明方式 let、const
  8. 基于JAVA+SpringMVC+Mybatis+MYSQL的养老社区管理系统
  9. cts测试的一些总结
  10. hdu 1575 Tr A (二分矩阵)
  11. JavaScript 基础(超详细)
  12. SpringBoot整合Cas
  13. 计算机vb代码电阻,利用VB程序编写色环电阻阻值计算器
  14. 基于java springboot的图书管理系统设计和实现
  15. web前端 “我是有底线的”效果
  16. 如何使用NodeJS发送邮件
  17. 前端和后台BUG区分方法
  18. 玩家自述:遇到欠费请拨9电话骗局如何应对?
  19. 机器学习—分类算法的对比实验
  20. paddlepaddle测试安装_专栏 | 新手入门?一步一步教你如何安装PaddlePaddle

热门文章

  1. 神一样的存在,河北衡水中学2019高考再次碾压所有中学
  2. 中国陷入超低生育率陷阱
  3. CTP下单与持仓查询
  4. jQuery学习第二天——jQuery的常见效果(上)
  5. 截图神器推荐 ShareX
  6. BADI 构建方法(NEW BADI 实施)
  7. 线性判别分析(LDA),二次判别分析(QDA)和正则判别分析(RDA)
  8. 什么是番茄工作法?如何使用番茄工作法?
  9. python 保存网页为html_如何使用Python保存“完整网页”而不仅仅是基本的html
  10. 让我们一起打起FPGA工程师就业保卫战