Cfree5可以JAVA_C语言中free函数的使用详解
free函数是我们再写C语言程序时常用的函数,但是使用时需要注意,一不小心很肯能会引起吐核。
注意:free函数与malloc()函数配对使用,释放malloc函数申请的动态内存。对于free(p)这句语句,如果p 是NULL 指针,那么free 对p 无论操作多少次都不会出问题。如果p 不是NULL 指针,那么free 对p连续操作两次就会导致程序运行错误。
看一个程序
#include
#include
int main()
{
char * name = NULL;
free(name);
free(name);
free(name);
printf("no problem11111111\n");
name = (char *) malloc(10);
if(name)
{
printf("allocate successful\n");
}
else
{
printf("allocate failed\n");
}
free(name);
free(name);
printf("no problem2222222\n");
return 0;
}
运行结果:
这个程序正好验证了上面的注意事项。
为了避免出现这个错误,自己写了一个函数:
void myfree(void ** point)
{
if(*point != NULL)
{
free(*point);
*point = NULL;
}
}
这个函数将一级指针的地址作为菜蔬传入,这样就可以对一级指针进行操作。每次用free释放完空间,都将一级指针置为NULL,这样就避免了重复释放时程序崩溃。
将这个函数应用到刚才的程序中就是:
#include
#include
void myfree(void ** point)
{
if(*point != NULL)
{
free(*point);
*point = NULL;
}
}
int main()
{
char * name = NULL;
myfree((void**)&name);
myfree((void**)&name);
myfree((void**)&name);
printf("no problem11111111\n");
name = (char *) malloc(10);
if(name)
{
printf("allocate successful\n");
printf("地址为: %p\n",name);
}
else
{
printf("allocate failed\n");
}
myfree((void**)&name);
myfree((void**)&name);
printf("no problem2222222\n");
return 0;
}
可以发现程序已经没有错误。
但是还有一个问题需要处理: 每次调用myfree函数的时候都需要取一级指针的地址而且需要强制类型转换成void** ,也就是每次都要写(void**)&point,这样很麻烦。
其实我们可以用带参数的宏定义来简化代码,宏定义如下:
#define FREE(p) myfree((void **)&p)
应用宏定义后的完整代码:
#include
#include
#define FREE(p) myfree((void **)&p)
void myfree(void ** point)
{
if(*point != NULL)
{
free(*point);
*point = NULL;
}
}
int main()
{
char * name = NULL;
FREE(name);
FREE(name);
FREE(name);
printf("no problem11111111\n");
name = (char *) malloc(10);
if(name)
{
printf("allocate successful\n");
printf("地址为: %p\n",name);
}
else
{
printf("allocate failed\n");
}
FREE(name);
FREE(name);
printf("no problem2222222\n");
return 0;
}
好了今天就写到这里了,希望对你有帮助,如有不正确的地方,还请指点。多谢~~
Cfree5可以JAVA_C语言中free函数的使用详解相关推荐
- c语言memcopy_C语言中memcpy 函数的用法详解
C语言中memcpy 函数的用法详解 memcpy(内存拷贝函数) c和c++使用的内存拷贝函数,memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址 ...
- x3用c语言函数表示,C语言中strtod()函数的用法详解
函数原型: #include double strtod(const char *nptr, char **endptr); C语言及C++中的重要函数. 名称含义 strtod(将字符串转换成浮点数 ...
- C语言中strtod()函数的用法详解
函数原型: #include <stdlib.h> double strtod(const char *nptr, char **endptr); C语言及C++中的重要函数. 名称含义 ...
- R语言中Axis()函数的参数详解
axis(side, at = NULL, labels = TRUE, tick =TRUE, line = NA, pos = NA, outer = FALSE, font = NA, lty ...
- sizeof 在C语言的作用,C语言中的sizeof的用法详解
C语言中的sizeof的用法详解 一.sizeof的概念 sizeof是C语言的一种单目操作符,如C语言的其他操作符++.--等.它并不是函数.sizeof操作符以字节形式给出了其操作数的存储大小.操 ...
- C语言中for循环的使用详解及注意点
C语言中for循环的使用详解及注意点 1.for语句的格式 2.for语句循环示例 3.注意 4.与while语句的比较 5.典型例题 1.for语句的格式 for(表达式1;表达式2;表达式3){循 ...
- c语言指定变量地址,C语言中 “_at()” 特殊地址定位详解
C语言中 "_at()" 特殊地址定位详解 在keil里面,有一个特殊地址定位的指令,就是将一个变量或常量定位到一个指定的地址上面 指令为 __at ,使用方法如下 int var ...
- C语言中fscanf的作用,C语言中fgets和fscanf区别详解
搜索热词 C语言中fgets和fscanf区别详解 一.作用上的大概区别: ①fgets:从文件中读取一行数据存入缓冲区(fgets遇到回车才会结束,不对空格和回车做任何转换就录入到缓冲区,结束后再往 ...
- c语言putchar与getchar,C语言中的getchar和putchar详解
首先给出<The_C_Programming_Language>这本书中的例子: #include int main() { int c; c = getchar(); while (c ...
- C语言中static关键字的作用详解,全网最透彻
在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条. (1)先来介绍它的第一条也是最重要的一条:隐藏. 当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有 ...
最新文章
- SAP MM 公司间STO的BILLING输出报错 - Inbound partner profile does not exist –
- 辨别 Windows CE, Windows XP Embedded 和 Windows Mobile
- 在计算机科学中算法这个术语是,计算机科学与基础考试模拟一.docx
- 防重复请求处理的实践与总结
- 解决QT出现XXXX.dll不能加载问题
- C#设计模式--简单工厂模式
- php curl ssr,php curl模拟登陆
- Tableau连接Mysql数据库,按钮为灰色
- 微信支付,redirect_uri域名与后台配置不一致,错误代码10003
- Spring源码系列:BeanDefinition载入(下)
- NGINX实现负载均衡,并利用PHP实现session入库
- windows nslookup 查询域名并生成路由批处理
- VB.net小技巧——VB中调用matlab
- matlab平面电磁波入射_MATLAB仿真平面电磁波在不同媒介分界面上的入射
- oracle批量修改同义词,ORACLE数据库 批量创建同义词
- 计算机如何与光猫连接网络,路由器怎么连接猫和电脑 路由器连接详解【图文】...
- Spring Security(安全)
- spark.DataFrame离群值处理
- js怎么获取电脑硬件信息
- 通过随机森林的例子解释特征重要性