我们在编写一段代码时,往往会有许多不可避免的bug出现。这时如何快速地找出并修改这些bug就变得至关重要,本期我们将介绍一些在调试中使我们的代码变得更健全与完善的一些小技巧。
本期主要介绍assert与const的使用技巧
下面我来举几个具体的使用场景:
<模拟实现库函数strcpy>
#include
void my_strcpy(char* dest,char* src)
{
while(*src != '\\0')
{
*dest = *src;
src++;
dest++;
}
*dest=*src;
}
int main()
{
//strcpy-->字符串拷贝
char arr1[]="################";
char arr2[]="bit";
my_strcpy(arr2,arr1);
printf("%s\\n",arr1);
return 0;
}
如此,我们就成功地完成了任务,但我们如果用到今天提到的“assert”,则会使我们的代码更加健全,不容易在发生错误的情况下使程序崩溃。
下面来看改进版:
void my_strcpy(char* dest,char* src)
{
assert(dest != NULL);//断言
assert(src != NULL);//断言
while(*src != '\\0')
{
*dest = *src;
src++;
dest++;
}
*dest=*src;
}
以上改进版的函数的优势就在于当我们出现传参错误(例如将空指针NULL传入函数)时,系统就会自动报错而不是运行错误甚至崩溃。
当然,上述代码还有很多值得改动和优化的地方,我们后续会集中介绍。
const是一个修饰符,它可以一个变量转换为常量,且无法修改。
下面我们用相同的例子来解释const的使用方法
#include
void my_strcpy(char* dest,char* src)
{
while(*src != '\\0')
{
*dest = *src;
src++;
dest++;
}
*dest=*src;
}
这是我们刚才所写的函数,但在我们函数的具体使用过程中如果将源头数组与目标数组弄混,程序运行就会错误且不易被察觉。这时我们如果使用const 修饰一下源头数组,再出现以上错误系统就会自动报错,从而使错误被发现。使用如下:
#include
void my_strcpy(char* dest,const char* src)//注意此处const
{
while(*src != '\\0')
{
*dest = *src;
src++;
dest++;
}
*dest=*src;
}
这样,当我们传参错误导致源头数组被更改时,系统就会自动提示我们代码出现问题了。
值得一提的是虽然用const 修饰的变量理论上无法被更改,但实际上我们仍可以通过对该变量的地址解引用来实现对此变量的更改:
int main ()
{
const int num=10;//虽然无法直接改变num的值
int* p=#
*p=20;//但可以通过此方式来更改
}
实际上此操作并不合法,如果我们不想让num通过地址被改变,我们也可以用const来修饰 “int* p” ,从而使*p(也就是num)无
全部0条评论
快来发表一下你的评论吧 !