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函数的使用详解相关推荐

  1. c语言memcopy_C语言中memcpy 函数的用法详解

    C语言中memcpy 函数的用法详解 memcpy(内存拷贝函数) c和c++使用的内存拷贝函数,memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址 ...

  2. x3用c语言函数表示,C语言中strtod()函数的用法详解

    函数原型: #include double strtod(const char *nptr, char **endptr); C语言及C++中的重要函数. 名称含义 strtod(将字符串转换成浮点数 ...

  3. C语言中strtod()函数的用法详解

    函数原型: #include <stdlib.h> double strtod(const char *nptr, char **endptr); C语言及C++中的重要函数. 名称含义 ...

  4. R语言中Axis()函数的参数详解

    axis(side, at = NULL, labels = TRUE, tick =TRUE, line = NA, pos = NA, outer = FALSE, font = NA, lty ...

  5. sizeof 在C语言的作用,C语言中的sizeof的用法详解

    C语言中的sizeof的用法详解 一.sizeof的概念 sizeof是C语言的一种单目操作符,如C语言的其他操作符++.--等.它并不是函数.sizeof操作符以字节形式给出了其操作数的存储大小.操 ...

  6. C语言中for循环的使用详解及注意点

    C语言中for循环的使用详解及注意点 1.for语句的格式 2.for语句循环示例 3.注意 4.与while语句的比较 5.典型例题 1.for语句的格式 for(表达式1;表达式2;表达式3){循 ...

  7. c语言指定变量地址,C语言中 “_at()” 特殊地址定位详解

    C语言中 "_at()" 特殊地址定位详解 在keil里面,有一个特殊地址定位的指令,就是将一个变量或常量定位到一个指定的地址上面 指令为 __at ,使用方法如下 int var ...

  8. C语言中fscanf的作用,C语言中fgets和fscanf区别详解

    搜索热词 C语言中fgets和fscanf区别详解 一.作用上的大概区别: ①fgets:从文件中读取一行数据存入缓冲区(fgets遇到回车才会结束,不对空格和回车做任何转换就录入到缓冲区,结束后再往 ...

  9. c语言putchar与getchar,C语言中的getchar和putchar详解

    首先给出<The_C_Programming_Language>这本书中的例子: #include int main() { int c; c = getchar(); while (c  ...

  10. C语言中static关键字的作用详解,全网最透彻

    在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条. (1)先来介绍它的第一条也是最重要的一条:隐藏. 当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有 ...

最新文章

  1. SAP MM 公司间STO的BILLING输出报错 - Inbound partner profile does not exist –
  2. 辨别 Windows CE, Windows XP Embedded 和 Windows Mobile
  3. 在计算机科学中算法这个术语是,计算机科学与基础考试模拟一.docx
  4. 防重复请求处理的实践与总结
  5. 解决QT出现XXXX.dll不能加载问题
  6. C#设计模式--简单工厂模式
  7. php curl ssr,php curl模拟登陆
  8. Tableau连接Mysql数据库,按钮为灰色
  9. 微信支付,redirect_uri域名与后台配置不一致,错误代码10003
  10. Spring源码系列:BeanDefinition载入(下)
  11. NGINX实现负载均衡,并利用PHP实现session入库
  12. windows nslookup 查询域名并生成路由批处理
  13. VB.net小技巧——VB中调用matlab
  14. matlab平面电磁波入射_MATLAB仿真平面电磁波在不同媒介分界面上的入射
  15. oracle批量修改同义词,ORACLE数据库 批量创建同义词
  16. 计算机如何与光猫连接网络,路由器怎么连接猫和电脑 路由器连接详解【图文】...
  17. Spring Security(安全)
  18. spark.DataFrame离群值处理
  19. js怎么获取电脑硬件信息
  20. 通过随机森林的例子解释特征重要性

热门文章

  1. 计算机设备运行频率单位,计算机常见计量单位解析
  2. 仓储管理之盘点——盘点方法
  3. python 字符串分割方法_Python字符串分割方法总结
  4. 如何在Edge中添加兼容性站点?
  5. 微服务之核心架构思维
  6. vscode跳转返回快捷键
  7. SPSS入门笔记记录
  8. 你知道嵌入式开发主要做什么吗?
  9. 如何导入支付宝的SDK及其模拟使用
  10. video.js插件的使用