详解C语言assert宏

news2025/1/11 23:51:54

前言:我们经常在写代码时,发现一些大牛的代码中总有一句assert(表达式),经过在网上的学习,笔者也浅显的了解了assert的相关知识,assert一般用于规范代码,避免不必要的错误,下面与大家分享。

1.assert宏基本介绍

  • 原型:

  • 作用:

在这里插入图片描述

 简单来说,就是如果espression的值为0,或false(比如指针为NULL)时,就会调用abort函数来终止程序的运行,并告诉你具体的错误信息,比如如果判断为0,以下列格式输出错误信息

2.常见用法

  • 检查函数参数是否错误(最常见的是传递NULL)

        在传递函数参数时,经常会出现传递指针变量的情况(地址),一不注意,就会发生传递空指针的情况,这种情况下传递的函数参数是错误的,所以需要添加assert来规避这个错误。

        代码1:一个简单的代码

 

        代码2:my_strcpy的实现

//简化代码   标准代码,要考虑到所有可能出现错误的地方,比如指针经常传递NULL
char* my_strcpy(char* dest, const char* src)
{
	assert(src);//等价于assert(src!=NULL)
	assert(dest != NULL);
	char* ret = dest;
	while (*dest++ = *src++);//后置加,先把赋值后的结果先被while使用,再++
	return ret;
}
int main()
{
	/*char arr1[] = "hello world";*/
	char *p=NULL;
	char arr2[] = "xxxxxxxxxxx";

	printf("%s\n", my_strcpy(arr2, p));
	return 0;
}
  • 检查数组索引

 

/*定义一个全局的数组*/
static int my_array[10] = { 1,2,3,4,5,6,7,8,9,10 };
int get_array_index(int index)
{
	/*判断数组索引是否越界*/
	assert(index >= 0 && index < 10);//索引的值只能在0和9之间
	return my_array[index];
}
int main()
{
	/*目的:查找my_array数组中对应位置的元素,5就是查找第五个元素*/
	int x = get_array_index(5);
	int y = get_array_index(15);//超过索引,所以会报错

	return 0;
}

3.assert宏的注意事项

        1.#define NEDBUG

        我们使用assert主要是为了发现并减少编程时出现的错误,而不是在用户端或运行时显示错误,所以一般在程序员调试完毕之后要添加#define NEDBUG 来终止所有assert的功能,也就是说所有的assert宏都失效了。为什么这么做呢,主要有以下几点原因

  • assert一般用于捕获编程时出现的错误或异常情况,在实际运行中会影响程序性能和用户体验感;
  • 减少发布后程序的体积,提高程序运行速度,减少占用的系统空间;
  • 避免敏感数据的泄露(因为报错的信息十分详细,有文件名,具体代码位置);

        2.使用一定要包含头文件  #include <assert.h>

4.总结:assert可以帮助我们规范代码,帮助程序员及时捕获错误,在适当位置添加assert宏是一个很好的代码习惯,希望大家可以规范自己的代码!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/558425.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux高级 I/O(5)】初识存储映射 I/O——mmap()和 munmap()(附代码示例)

存储映射 I/O 存储映射 I/O&#xff08;memory-mapped I/O&#xff09;是一种基于内存区域的高级 I/O 操作&#xff0c;它能将一个文件映射到进程地址空间中的一块内存区域中&#xff0c;当从这段内存中读数据时&#xff0c;就相当于读文件中的数据&#xff08;对文件进…

【数据库系统设计栗子】——图书借阅简单设计

图书借阅简单设计&#x1f60e; 前言&#x1f64c;需求分析——数据结构1.1图书信息1.2 书库信息1.3 图书库存信息1.4 用户1.5 借阅1.6 借阅记录概念模型E-R图 逻辑模型 总结撒花&#x1f49e; &#x1f60e;博客昵称&#xff1a;博客小梦 &#x1f60a;最喜欢的座右铭&#xf…

“三化”引领潮流,时尚代名词

大家好&#xff01;我是微三云小鱼&#xff01; 下面给大家分享一下“潮流文化” 如今越来越多的企业都在向数字化前进 而且也相信数字化代表着 向上、未来还是时尚&#xff0c; 各个企业都希望通过数字化 改变现代管理理念。 希望 像打开云计算一样拓展 另外一个渠道。 除了数…

Redis存在线程安全问题吗?让我们来谈谈!

大家好&#xff0c;我是你们的小米。在之前的文章中&#xff0c;我们谈到了Redis存在的线程安全问题。今天&#xff0c;我将以一个电商项目的实际案例来演示&#xff0c;为大家详细解析Redis线程安全问题的原因&#xff0c;并分享一些具体的解决措施。 为什么存在线程安全问题&…

Java程序设计入门教程--物体的抽象过程

类的概念 面向对象的思想来源于对客观世界的认知。 现实的世界是缤纷复杂、种类繁多&#xff0c;难于认识和理解的&#xff0c;但聪明的人们学会了把这些错综复杂的事物进行分类&#xff0c;从而使世界变得井井有条。比如我们由各式各样的汽车抽象出汽车的概念&#xf…

chatgpt赋能Python-python_label颜色

Python Label 颜色的重要性 在Python编程中&#xff0c;我们经常会使用Label来表示文本标签&#xff0c;并且经常需要为这些标签创建不同的颜色&#xff0c;以区分和凸显关键信息。正确选择和使用标签颜色将有助于提高代码的可读性和可维护性&#xff0c;并且在应用程序和Web开…

云渲染时能否关机或断网?

先说一下云渲染&#xff1a; 基于渲染农场&#xff0c;用户可以将自己制作好的文件打包&#xff0c;通过云渲染客户端将打包文件上传到云渲染的服务器进行渲染。以下是 云渲染中能否关电脑的相关回答&#xff1a; 1.提交、上传文件时可以关电脑吗&#xff1f; 不能。文件提交是…

【敬伟ps教程】颜色和图案的填充

文章目录 油漆桶工具填充命令前景色内容识别图案历史记录黑白灰 渐变图层样式填充填充图层 油漆桶工具 油漆桶工具可以填充前景色和图案&#xff0c;快捷键 G 选好前景色&#xff0c;点击画布&#xff0c;画布就会被填充前景色&#xff1b; 建立选区后&#xff0c;填充会在选…

迅为龙芯2K1000开发板国产处理器操作系统

1、硬件配置 国产龙芯处理器&#xff0c;双核64位系统&#xff0c;板载2GDDR3内存&#xff0c;流畅运行Busybox、Buildroot、Loognix、QT5.12 系统! 2、接口全 板载4路USB HOST、2路千兆以太网、2路UART、2路CAN总线、Mini PCIE、SATA固态盘接口、4G接口、GPS接口WIFI、蓝牙…

算法27:从暴力递归到动态规划(1)

题目&#xff1a;已知数列的规则为 1 1 2 3 5 8 13 21 ..... * 按照这种规则&#xff0c;求第n项, n > 2. 这是典型的斐波拉切数列, 公式为 F(n)F(n - 1)F(n - 2) 那么就可以推导出 F(n)F(n - 1) F(n - 2) F(n-1)F(n - 2) F(n - 3) F(n-2)F(n - 3) F(n - 4) F(3)F(n -…

Spring Boot 如何处理国际化

Spring Boot 国际化 在全球化的今天&#xff0c;很多应用程序需要支持多种语言和地区。为了满足不同用户的需求&#xff0c;应用程序需要提供多语言的支持。Spring Boot 提供了强大的国际化支持&#xff0c;使得开发人员能够轻松地为应用程序添加多语言支持。本文将介绍如何使…

chatgpt赋能Python-python_id用法

Python ID用法介绍 在 Python 编程中&#xff0c;ID 是一个极其重要的概念。ID 是一个对象在内存中的唯一标识符&#xff0c;每个对象都有一个唯一的 ID。在本文中&#xff0c;我们将介绍 Python ID 的用途和用法&#xff0c;并且给出一些示例&#xff0c;以帮助读者更好地理解…

lab4:以time/gettimeofday系统调用为例分析ARM64 Linux 5.4.34

一、ARM64 Linux系统调用过程 &#xff08;1&#xff09;svc指令触发系统调用。 &#xff08;2&#xff09;保存现场&#xff08;el0_sync处的内核汇编代码保存异常发生时程序的执行现场&#xff09;&#xff0c;然后根据异常发生的原因&#xff08;ESR_EL1寄存器&#xff09;…

“不务正业”的奶茶店三个月实现30+万收入

今天我和大家分享一个 我身边的案例。 我有一个朋友 和我分享他朋友的 一个奶茶店 互联网商城的故事。 19年李某开了一家 奶茶店&#xff0c;同时呢 自己在平台做了一个 线上购买奶茶的商城 他是怎么做的呢&#xff1f; 原来每次有客户来到店 购买奶茶的时候。 他会和客户说 扫…

BetaFlight Mark4 H7 Dual270 + BN880 + CRSF 配置存档

BetaFlight Mark4 H7 Dual270 BN880 CRSF 配置存档 1. 源由2. 配置2.1 端口2.2 系统2.3 对齐2.4 GPS2.5 救援2.6 PID2.7 Rate2.8 滤波2.9 接收器2.10 模式2.11 电机 3.差异4. 整机效果5. 飞行效果6. 参考资料 1. 源由 手头这台航模四轴&#xff0c;基本调试的差不多&#xf…

【数据分析之道-Numpy(八)】numpy统计函数

文章目录 专栏导读1、np.mean()2、np.median()3、np.std()4、np.var()5、np.min()6、np.max()7、np.sum()8、np.prod()9、np.percentile()10、np.any()11、np.all() 专栏导读 ✍ 作者简介&#xff1a;i阿极&#xff0c;CSDN Python领域新星创作者&#xff0c;专注于分享python领…

Qt QGenericPlugin插件使用案例

问题描述: Qt插件的编写,有两种方式,一种是直接通过自定义接口类Interface来实现,一种是通过QtCreator自带的插件模板来创建。 这里我们先来实现第二种。 功能为点击主界面的按钮,显示插件界面。(插件和开发库一样,什么都可以放进去,只不过就是封装成方便调用的模块…

Vue|非单文件组件

传统网页一些不可避免的小问题: 1.网页JS、CSS等资源依赖关系混乱,不方便维护 2.代码复用率很低 使用组件将代码进行复用,简化项目结构,提高运行效率,便于维护 组件定义传统网页组件 传统代码实现步骤 组件代码定义组件注册组件局部注册全局注册 使用组件避坑 组件定义 组件即为…

聊聊如何利用spring插件来实现策略模式

前言 偶然的机会发现spring有个spring-plugin&#xff0c;官网对它的介绍是 Spring Plugin provides a more pragmatic approach to plugin development by providing the core flexibility of having plugin implementations extending a core system’s functionality but o…

linux上使用系统安装和Docker安装mysql的两种方式

一、安装到linux 1、安装mysql-server 1、在安装之前查看下系统是否已经安装了mysql ls /usr/share2、安装mysql-server sudo apt-get install mysql-server3、再次查看&#xff0c;发现多了个mysql ls /usr/share | grep mysql //在ls打印结果中搜索mysql关键字4、登陆 在…