详解C语言assert宏

assert宏用于在代码中进行条件检查,防止程序因错误的参数或状态而运行错误。当表达式的值为0或false时,assert会终止程序并提供错误信息。常见的用法包括检查函数参数是否为NULL和数组索引是否越界。在调试完成后,通常通过#defineNDEBUG禁用assert以优化性能和保护敏感信息。良好的编程习惯是在适当位置使用assert进行错误检测。
摘要由CSDN通过智能技术生成

前言:我们经常在写代码时,发现一些大牛的代码中总有一句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宏是一个很好的代码习惯,希望大家可以规范自己的代码!

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值