c语言free函数的作用,c语言中free函数的理解
最近在复习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函数的理解相关推荐
- c语言time函数的作用,c语言中time函数的用法
c语言中time函数的用法 c语言中time函数的用法的用法你知道吗?下面应届毕业生小编就跟你们详细介绍下c语言中time函数的用法的用法,希望对你们有用. c语言中time函数的用法的用法如下: 头 ...
- 在c语言中log函数的作用,C语言中log函数怎么使用啊
优质回答 回答者:奔跑的五花肉11 1.C语言中,有两个log函数,分别为log10和log函数,具体用法如下: 2.函数名: log10 功 能: 对数函数log,以10为底 用 法: double ...
- c语言pow函数的作用,c语言中pow函数的用法是什么?_后端开发
在c言语中pow()函数是用来求x的y次幂.x.y及函数值都是double型 ,其语法为"double pow(double x, double y)":个中参数"dou ...
- exit在c语言里的作用,C语言中exit函数的使用
exit() 结束当前进程/当前程序/,在整个程序中,只要调用 exit ,就结束 return() 是当前函数返回,当然如果是在主函数main, 自然也就结束当前进程了,如果不是,那就是退回上一层调 ...
- C语言一定要有函数声明吗,1 什么是C语言的隐式函数声明在C语言中,函数在调用前不一定非要声明。如果没有声明,那么编译器会自动按照一种隐式声明的规则,为调用函数的C代码产生汇编代码。下...
1 什么是C语言的隐式函数声明 在C语言中,函数在调用前不一定非要声明.如果没有声明,那么编译器会自动按照一种隐式声明的规则,为调用函数的C代码产生汇编代码.下面是一个例子: int main(int ...
- c语言中rand()的作用,c语言中rand()函数怎么用? rand函数的用法
导航:网站首页 > c语言中rand()函数怎么用? rand函数的用法 c语言中rand()函数怎么用? rand函数的用法 相关问题: 匿名网友: rand(产生随机数) 相关函数 sran ...
- c语言fgetc函数作用,C语言中fgetc函数的使用方法
该函数包含在C语言中的stdio.h头文件中,主要功能是从流中读取一个字符,并增加文件指针的位置. 函数原型:int fgetc(FILE *fp); 函数功能:从流中读取字符,即从fp所指定的文件中 ...
- c语言中argc的作用,C语言中main函数的参数argc和argv
参考资料: C++语言中的main函数,经常带有参数argc,argv,如下: int main(int argc, char** argv) int main(int argc, char* arg ...
- java中flush函数作用_Java语言中flush()函数作用及使用方法详解
最近在学习io流,发现每次都会出现flush()函数,查了一下其作用,起作用主要如下 //------–flush()的作用--------– 笼统且错误的回答: 缓冲区中的数据保存直到缓冲区满后才写 ...
最新文章
- asp.net中将Excel文件(.xls)绑定到DataGrid
- git初始化及关联远程仓库命令
- 计算机地址码特点,电脑摇头灯的地址码的设定问题你必须要注意的
- 8. Dropout and Strides For Larger Models
- Vue CLI 安装
- NOIP1996复赛 普及组 第二题 python
- 【ES6(2015)】新的声明方式 let、const
- 基于JAVA+SpringMVC+Mybatis+MYSQL的养老社区管理系统
- cts测试的一些总结
- hdu 1575 Tr A (二分矩阵)
- JavaScript 基础(超详细)
- SpringBoot整合Cas
- 计算机vb代码电阻,利用VB程序编写色环电阻阻值计算器
- 基于java springboot的图书管理系统设计和实现
- web前端 “我是有底线的”效果
- 如何使用NodeJS发送邮件
- 前端和后台BUG区分方法
- 玩家自述:遇到欠费请拨9电话骗局如何应对?
- 机器学习—分类算法的对比实验
- paddlepaddle测试安装_专栏 | 新手入门?一步一步教你如何安装PaddlePaddle