• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > C语言中free函数的使用详解

C语言中free函数的使用详解

作者:青儿哥哥 字体:[增加 减小] 来源:互联网 时间:2017-05-28

青儿哥哥 通过本文主要向大家介绍了c语言free函数,c语言中free函数,c语言free函数头文件,c语言free,c语言中free的用法等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

free函数是我们再写C语言程序时常用的函数,但是使用时需要注意,一不小心很肯能会引起吐核。

 注意:free函数与malloc()函数配对使用,释放malloc函数申请的动态内存。对于free(p)这句语句,如果p 是NULL 指针,那么free 对p 无论操作多少次都不会出问题。如果p 不是NULL 指针,那么free 对p连续操作两次就会导致程序运行错误。

 看一个程序

#include <stdio.h>
#include <stdlib.h>

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;
}
</div>

运行结果:

这个程序正好验证了上面的注意事项。

为了避免出现这个错误,自己写了一个函数:

void myfree(void ** point)
{
  if(*point != NULL)
  {
    free(*point);
    *point = NULL;
  }
}
</div>

这个函数将一级指针的地址作为菜蔬传入,这样就可以对一级指针进行操作。每次用free释放完空间,都将一级指针置为NULL,这样就避免了重复释放时程序崩溃。

将这个函数应用到刚才的程序中就是:

#include <stdio.h>
#include <stdlib.h>


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;
}
</div>

 可以发现程序已经没有错误。

但是还有一个问题需要处理: 每次调用myfree函数的时候都需要取一级指针的地址而且需要强制类型转换成void** ,也就是每次都要写(void**)&point,这样很麻烦。

其实我们可以用带参数的宏定义来简化代码,宏定义如下:

#define FREE(p) myfree((void **)&p)
</div>

 应用宏定义后的完整代码:

#include <stdio.h>
#include <stdlib.h>


#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;
}
 
</div>

好了今天就写到这里了,希望对你有帮助,如有不正确的地方,还请指点。多谢~~

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C语言中free函数的使用详解
  • C语言之free函数以及野指针介绍

相关文章

  • 2017-05-28C++中的三种继承public,protected,private详细解析
  • 2017-05-28C语言矩阵连乘 (动态规划)详解
  • 2017-05-28c++将数组名作为函数参数对数组元素进行相应的运算
  • 2017-05-28C语言的fork函数在Linux中的进程操作及相关面试题讲解
  • 2017-05-28VC实现获取当前正在运行的进程
  • 2017-05-28pcre函数详细解析
  • 2017-05-28C++中用两个标准容器stack,实现一个队列的方法详解
  • 2017-05-28C++中指向结构体变量的指针
  • 2017-05-28纯c语言实现面向对象分析与示例分享
  • 2017-05-28C字符串与C++字符串的深入理解

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C++中的explicit关键字实例浅析
    • 深入解析C++编程中对设计模式中的策略模式的运用
    • C++简单集合类的实现方法
    • C++11的for循环,以及范围Range类的简单实现
    • 基于条件变量的消息队列 说明介绍
    • C++ COM编程之什么是组件?
    • c++中堆栈及创建对象示例代码
    • 显示任何进程加载的DLL文件的代码
    • 判断指定的进程或程序是否存在方法小结(vc等)
    • 输出1000以内的素数的算法(实例代码)

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有