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列操作与查询技巧
如何快速搭建虚拟主机网站?新手必看指南

