全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

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

运行结果:

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

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

void myfree(void ** point)
{
  if(*point != NULL)
  {
    free(*point);
    *point = NULL;
  }
}

这个函数将一级指针的地址作为菜蔬传入,这样就可以对一级指针进行操作。每次用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;
}

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

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

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

#define FREE(p) myfree((void **)&p)

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

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

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


# c语言free函数头文件  # c语言中free函数  # c语言free函数怎么用  # C语言之malloc动态分配内存和free释放  # C语言初识动态内存管理malloc calloc realloc fr  # C语言中的const和free用法详解  # 详解C语言中free()函数与getpagesize()函数的使用  # C语言之free函数以及野指针介绍  # C语言中多维数组的内存分配和释放(malloc与free)的方法  # 浅谈C语言Free空指针会怎样  # 就会  # 好了  # 如有  # 可以用  # 两次  # 你有  # 要注意  # 还有一个  # 写了  # 就可  # 都将  # 写到  # 每次都  # 转换成  # 这句  # 以对  # 不正确  # 为了避免  # 还请  # 问题需要 


相关文章: 网站规划与制作是什么,电子商务网站系统规划的内容及步骤是什么?  建站主机选购指南:核心配置与性价比推荐解析  北京制作网站的公司,北京铁路集团官方网站?  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  怎么用手机制作网站链接,dw怎么把手机适应页面变成网页?  如何选择香港主机高效搭建外贸独立站?  如何高效利用亚马逊云主机搭建企业网站?  寿县云建站:智能SEO优化与多行业模板快速上线指南  非常酷的网站设计制作软件,酷培ai教育官方网站?  家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?  已有域名和空间如何快速搭建网站?  内部网站制作流程,如何建立公司内部网站?  如何有效防御Web建站篡改攻击?  如何解决ASP生成WAP建站中文乱码问题?  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  如何快速搭建高效WAP手机网站吸引移动用户?  常州企业建站如何选择最佳模板?  小捣蛋自助建站系统:数据分析与安全设置双核驱动网站优化  手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  建站主机功能解析:服务器选择与快速搭建指南  如何正确下载安装西数主机建站助手?  如何在服务器上配置二级域名建站?  测试制作网站有哪些,测试性取向的权威测试或者网站?  如何访问已购建站主机并解决登录问题?  香港网站服务器数量如何影响SEO优化效果?  高防服务器租用指南:配置选择与快速部署攻略  定制建站流程步骤详解:一站式方案设计与开发指南  如何快速配置高效服务器建站软件?  如何在Golang中使用encoding/gob序列化对象_存储和传输数据  油猴 教程,油猴搜脚本为什么会网页无法显示?  北京专业网站制作设计师招聘,北京白云观官方网站?  建站主机选购指南与交易推荐:核心配置解析  上海网站制作开发公司,上海买房比较好的网站有哪些?  如何用wdcp快速搭建高效网站?  云南网站制作公司有哪些,云南最好的招聘网站是哪个?  如何基于云服务器快速搭建个人网站?  如何通过建站之星自助学习解决操作问题?  制作网站公司那家好,网络公司是做什么的?  建站IDE高效指南:快速搭建+SEO优化+自适应模板全解析  青岛网站建设如何选择本地服务器?  青岛网站设计制作公司,查询青岛招聘信息的网站有哪些?  如何快速生成橙子建站落地页链接?  宝塔Windows建站如何避免显示默认IIS页面?  如何在Mac上搭建Golang开发环境_使用Homebrew安装和管理Go版本  ,有什么在线背英语单词效率比较高的网站?  如何高效配置IIS服务器搭建网站?  如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  如何用景安虚拟主机手机版绑定域名建站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。