Cfree5可以JAVA_C语言中free函数的使用详解

article/2025/10/15 15:17:03

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;

}

运行结果:

d9c98a71229945cfaf013bc58ff683ed.png

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

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

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;

}

451d36fa5640266508f527a197e54dcd.png

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

但是还有一个问题需要处理: 每次调用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;

}

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


http://chatgpt.dhexx.cn/article/HuLouNh5.shtml

相关文章

在Cfree5里使用多行快捷注释的方法

1.打开cfree5,点击上方 工具 选项。 2.点击 工具 选项后,进入“环境选项” 3.进入环境选项后就会发现上方有四个选项,点击“快捷键”这个选项,里面会出现很多操作的快捷键,往下翻就能找到快捷多行注释的选项了 4.此时点…

配置cfree 5 支持C++11

最近想学c的一些用法,但Cfree并不支持,所以在大牛的帮助下配置了一下cfree。 c-free5.0版本已经可以支持c99标准。由于CFree5.0自带的GCC版本只有3.4.0,并不支持C11,所以首先得去下载完整支持C11的4.8.1版本——TDM-GCC-64&#x…

C语言基础入门:C-Free5新建C语言工程

C语言 基础开发----目录 步骤1:打开软件 双击打开C-Free 5 步骤2:新建工程 当打开C-Free5软件的时候,就会弹出以下界面,点击新建工程。 如果没有弹出以上界面,就使用以下方法新建工程。 创建工程名字&#xff0c…

BDD100K数据集高速下载地址(百度网盘)

最近需要BDD100K的数据集,在网上找了好久下载地址,大部分要么不能用,要么下到一半就禁止下载了,气煞我也,还让我加什么qq群,加群,不可能,必须拒绝,因此在找到后第一个和小…

【BDD】BDD入门和工具对比

行为驱动开发(英语:Behavior-driven development,缩写BDD)是一种敏捷软件开发的技术,它鼓励软件项目中的开发者、QA和非技术人员或商业参与者之间的协作。BDD最初是由Dan North在2003年命名[1],它包括验收测…

说起BDD,你会想到什么?

在刚接触BDD(Behavior Driven Development,行为驱动开发)的时候,我以为就是用Cucumber这样的工具来编写场景用例,从而实现自动化测试,甚至很长时间分不清BDD和ATDD(Acceptance test driven development)到底…

BDD - Specflow BDD 执行测试,生成测试报告 VSTest 篇

BDD - Specflow BDD 执行测试,生成测试报告 VSTest 篇 引言VSTest.Console.exe 命令启动命令选项 VSTest.Console.exe 执行测试NUnit 项目MSTest 项目Xunit 项目SpecRun 项目 Specflow 生成测试报告specflow.exe 命令生成 NUnit 项目测试报告生成 MSTest 项目测试报…

行为驱动开发(BDD)你准备好了吗?

GitChat 作者:冰尘 原文:行为驱动开发(BDD)你准备好了吗? 关注微信公众号:「GitChat 技术杂谈」 一本正经的讲技术 【不要错过文末彩蛋】 这个Chat笔者将会和大家一起探讨下面的主题: 什么是…

BDD - SpecFlow BDD 测试实践 SpecFlow + Xunit

BDD - SpecFlow BDD 测试实践 SpecFlow Xunit 引言创建一个 .NET Framework 项目添加 SpecFlow package添加支持 xUnit NuGet 包App.config 和 packages.config 的变化创建 Spec feature 文件创建 step definition 文件创建一个被测类文件实现 steps执行测试 引言 BDD - Spec…

漫画 | 被TDD/BDD/DDD......“逼疯”的程序员

作为一个程序员,你需要学习编程语言和编程框架。 虽然有些难度,但是你最终能掌握它们,顺利地写出应用程序。 但是,编程行业总是有一些东西,看起来很美,很简单, 但非常难于掌握。 你会理解TDD/DD…

基于BDD的接口自动化框架开箱即用

1、背景说明 项目思想:BDD 行为驱动开发的思想褒贬不一,这里不多说。遵循的宗旨能解决业务痛点的思想就是好思想。 接口测试工具在实际的业务测试场景中往往会遇到一些使用上的局限性,自定义扩展要求技术较高,如果二次开发工具…

BDD之单元测试(三):BDD的官方教程

BDD之单元测试(二):ATDD,TDD,BDD的区别 BDD之单元测试(三):BDD的官方教程 BDD之单元测试(四):实际的项目教程 cucumber cucumber是BDD(Behav…

五分钟让你彻底了解TDD、ATDD、BDDRBE

在目前比较流行的敏捷开发模式(如极限编程、Scrum方法等)中,推崇“测试驱动开发(Test Driven Development,TDD)”——测试在先、编码在后的开发实践。TDD有别于以往的“先编码、后测试”的开发过程&#xf…

BDD(二元决策图)

转载自:二元决策图(Binary Decision Diagrams - BDD) (一) 在形式化验证、数字系统的设计和验证中,许多任务都涉及大型命题逻辑公式的运算。二元决策图(BDD)已经成为许多应用的首选表示方法。1986年&#x…

TDD和BDD的区别 (TDD vs BDD)

前言 如果你关注软件开发最佳实践方面的话题,你肯定听说过测试驱动开发(TDD - Test Driven Development) 和行为驱动开发(BDD - Behavior Driven Development)。这篇文章会为你阐述这两种模式的含义并举例,同时对二者进行比较。 测试驱动开发 (TDD) 当…

行为驱动开发(BDD)全面介绍

行为驱动开发(BDD)全面介绍 作者:杜铁绳 在软件行业中,软件研发项目软件产品交付经常被推迟、研发费用经常超出预算、经常遗漏客户所需的软件功能、有将近20%的项目最终无法交付,或者取消。这些软件研发往往花费了大…

web自动化测试进阶篇02 ——— BDD与TDD的研究实践

😏作者简介:博主是一位测试管理者,同时也是一名对外企业兼职讲师。 📡主页地址:【Austin_zhai】 🙆目的与景愿:旨在于能帮助更多的测试行业人员提升软硬技能,分享行业相关最新信息。…

全面理解BDD(行为驱动开发):转变思维方式,提升软件质量

在传统的软件开发流程中,开发人员和测试人员的工作通常是相互独立的。开发人员负责编写代码,测试人员负责找出代码中的问题。然而,这种方法可能导致沟通不足,而且会浪费时间和资源。为了解决这些问题,出现了一种新的开…

BDD - 介绍 Behavior-Driven Development 行为驱动开发

BDD - Behavior-Driven Development 行为驱动开发 引言什么是 BDD相关软件开发流程TDDATDDBDD 和 TDD 的关系 BDD 原则BDD 流程BDD 优势 引言 自从接触到 BDD,深有感触,BDD 是广大 QA 的福音,测试领域的天空豁然开朗。BDD 模式更有助于团队合…

BDD自动化测试

BDD(行为驱动开发)自动化测试在软件测试领域一直在发展。随着agile思想在越来越多的项目中推广,以及非开发人员在项目的更多参与,BDD风格的自动化测试被越来越多项目组采纳并实施。 BDD(Behavior Driven Development&…