C语言小撰特殊篇-assert断言函数

assert()函数是个比较特殊的函数,其内容不多,对于用户来说也没什么很大的意义,然而对于程序员调试过程则非常关键。

今既已兴起思维此物之心念,遂作简洁文章而解释:

首先,要使用assert函数必须要引用头文件assert.h,该头文件是否包含其他函数暂时未知,似乎只包含这一个函数。下面展示一个使用了该函数的代码:

cpp 复制代码
#include<assert.h>
#include<stdio.h>
int main()
{
	int arr[10] = { 57 };
	int* pa = arr;
	while (1) {
		if (*pa != 57) {
			pa = NULL;
		}
		else {
			printf("%d\n", *pa);
		}
		assert(pa!=NULL);
		pa += 1;
	}

	return 0;
}

在这里,我初始化数组arr的时候只初始化了arr0=57,其余的9个位置事实上都是随机的,不一定是什么,但是基本上不太可能是57,因此,当向下进行代码的时候,第一个arr0是57,可以被打印出来,其他的则因为不是57而导致其指针被if语句变成空指针NULL。

这里必须提示一点我之前写指针部分没有提到的内容,这种将指针设置为NULL的方法是一种固定用法,这个时候指针arr事实上就等于0,通常指针如果没有初始化也没有指向一个正常的变量地址的话,它就大概率是一个------野指针。而这种设置为NULL的方法能有效防止野指针对我们的破坏,以防止它可能的输出奇怪东西的情况。

我们说回这个代码,这个代码因为被设置为空指针NULL而导致assert断言的情况"pa!=NULL"断言失败,这个时候程序会直接停止运行并且无法继续进行下面的语句,而弹出终端报错。

它不但会弹出终端,而且会直接将详细信息提示出来,比如第几行代码断言失败之类的:

由此运行结果可以看出,断言失败的地方在这个文件的第846行。

对于程序员来说,这个功能有助于我们定位代码错误的位置,当我们觉得它没有必要再用但是又很难一下子全部删掉的时候,可以在最上面用宏定义加一句#define NDEBUG,就解决了assert终止程序的效果。只不过应当注意的是,程序这时候仍然会运行到这里,不满足assert条件的时候停下,只不过不会报错,也不打印错误信息了。

在普通用户用的release版本里这个功能通常是被默认禁用的,以提高程序运行的效率,防止突然冒出个东西烦你。

相关推荐
辰烨chenye2 小时前
LeetCode Hot 100 题解 · 普通数组篇
算法·leetcode·职场和发展
vx-Biye_Design3 小时前
SSM伴侣动物伴护星小程序06330-计算机课程设计、毕业设计
spring boot·后端·elasticsearch·小程序·架构·课程设计·idea
2分钟速写快排4 小时前
什么是 RAG?如何用 RAG 实现一个用户记忆?
前端·后端·ai编程
面向Google编程5 小时前
Apache Iceberg Variant 类型:v3 半结构化数据不再「二选一」
大数据·后端
jason成都5 小时前
Spring WebFlux 适配达梦新方案|dm‑r2dbc:Netty 异步传输的实验性 R2DBC 驱动
java·后端·spring
hqyjzsb5 小时前
零 AI 项目经验,学 Python 转型 AI 的正确顺序是什么?
开发语言·人工智能·python·算法·职场和发展·数据挖掘·数据分析
辰烨chenye6 小时前
LeetCode Hot 100 题解 · 二分篇
java·算法·leetcode
微功夫信息技术6 小时前
分层多智能体强化学习驱动的非急救转运公平 - 效率统一调度系统研究与实践
人工智能·学习·算法·动态规划
T1mzhou6 小时前
ARM64 Linux 6.10内核启动流程7-ioremap和readl writel
linux·服务器·c语言
sanjiaomao3336 小时前
从论文公式到Python实现:用单元测试校验滑动平均算法
python·算法·单元测试