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

发布时间 - 2026-01-11 01:12:45    点击率:

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空指针会怎样  # 就会  # 好了  # 如有  # 可以用  # 两次  # 你有  # 要注意  # 还有一个  # 写了  # 就可  # 都将  # 写到  # 每次都  # 转换成  # 这句  # 以对  # 不正确  # 为了避免  # 还请  # 问题需要 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案  Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】  Laravel如何使用Service Container和依赖注入?(代码示例)  网站制作软件免费下载安装,有哪些免费下载的软件网站?  javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】  新三国志曹操传主线渭水交兵攻略  HTML 中如何正确使用模板变量为元素的 name 属性赋值  如何快速搭建高效服务器建站系统?  晋江文学城电脑版官网 晋江文学城网页版直接进入  Python进程池调度策略_任务分发说明【指导】  香港服务器部署网站为何提示未备案?  如何在阿里云部署织梦网站?  怎么制作网站设计模板图片,有电商商品详情页面的免费模板素材网站推荐吗?  如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)  浏览器如何快速切换搜索引擎_在地址栏使用不同搜索引擎【搜索】  奇安信“盘古石”团队突破 iOS 26.1 提权  Internet Explorer官网直接进入 IE浏览器在线体验版网址  Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】  深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?  海南网站制作公司有哪些,海口网是哪家的?  个人摄影网站制作流程,摄影爱好者都去什么网站?  Laravel怎么在Controller之外的地方验证数据  ,交易猫的商品怎么发布到网站上去?  深圳网站制作的公司有哪些,dido官方网站?  如何用狗爹虚拟主机快速搭建网站?  佛山网站制作系统,佛山企业变更地址网上办理步骤?  如何确认建站备案号应放置的具体位置?  Laravel怎么清理缓存_Laravel optimize clear命令详解  猎豹浏览器开发者工具怎么打开 猎豹浏览器F12调试工具使用【前端必备】  独立制作一个网站多少钱,建立网站需要花多少钱?  如何在香港免费服务器上快速搭建网站?  html5的keygen标签为什么废弃_替代方案说明【解答】  如何快速搭建FTP站点实现文件共享?  电视网站制作tvbox接口,云海电视怎样自定义添加电视源?  laravel怎么为应用开启和关闭维护模式_laravel应用维护模式开启与关闭方法  Laravel如何记录自定义日志?(Log频道配置)  javascript基本数据类型及类型检测常用方法小结  利用vue写todolist单页应用  南京网站制作费用,南京远驱官方网站?  Laravel怎么生成二维码图片_Laravel集成Simple-QrCode扩展包与参数设置【实战】  如何快速生成ASP一键建站模板并优化安全性?  品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?  如何在阿里云通过域名搭建网站?  ,南京靠谱的征婚网站?  打开php文件提示内存不足_怎么调整php内存限制【解决方案】  Laravel怎么自定义错误页面_Laravel修改404和500页面模板  智能起名网站制作软件有哪些,制作logo的软件?  打造顶配客厅影院,这份100寸电视推荐名单请查收  Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧  如何快速搭建虚拟主机网站?新手必看指南