C语言入门——实用调试技巧

目录

一、调试是什么?

二、debug和release的介绍

三、windows环境调试介绍

1、调试环境的准备

2、快捷键

3、调试的时候查看程序当前信息

四、一些调试实例

五、如何写出好(易于调试)的代码

1、优秀的代码

2、常用的Coding技巧

3、示范:模拟实现库函数strcpy

六、编程常见的错误


一、调试是什么?

●调试,又称除错,是发现和减少计算机程序或电子仪器设备中程序错误的一个过程。

二、debug和release的介绍

Debug通常称为调试版本,它包含调试信息,并且不做任何优化,便于程序员调试程序。

Release版本称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户可以很好的使用。

三、windows环境调试介绍

1、调试环境的准备

设置为【debug】

2、快捷键

F5:

开始调试,经常用来直接跳到下一个断点处。

F9:

创建断点和取消断点

断点:可以在程序的任意位置设置断点,这样就使得程序在想要的位置随意停止执行,继而一步步执行下去

F11:

逐语句,就是每次都执行一条语句,但是这个快捷键可以使我们的执行逻辑进入函数内部

F10:

逐过程,通常用来处理一个过程,一个过程可以是一次函数调用,或者是一条语句

Ctrl+F5:

开始执行不调试,直接让程序运行起来

3、调试的时候查看程序当前信息

【调试】——【窗口】——【断点】、【监视】、【自动窗口】、【局部变量】、【调用堆栈】、【内存】、【反汇编】、【寄存器】等

四、一些调试实例

例1:求1!+2!+3!+...+n!

int main()
{
    int i=0;
    int sum=0;
    int n=0;
    int ret=1;
    scanf("%d",&n);
    for(i=1;i<=n;i++)
    {
        int j=0;
        for(j=1;j<=i;j++)    //代码错误,应该进行ret=1的初始化
        {
            ret*=j;
        }
        sum+=ret;
    }
    printf("%d\n",sum);
    return 0;
}

 例2:来源于《C陷阱和缺陷》

#include
int main()
{
    int i=0;
    int arr[10]={1,2,3,4,5,6,7,8,9,10};
    for(i=0;i<=12;i++)
    {
        arr[i]=0;
        printf("hehe\n");
    }
    return 0;
}
//代码进入死循环
//因为数组越界,arr[12]访问到了i占用的区域

原因:

i和arr是局部变量,都放在栈区上。栈区内存的使用习惯是先使用高地址空间,再使用低地址空间。

五、如何写出好(易于调试)的代码

1、优秀的代码

●代码运行正常

●bug很少

●效率高

●可读性高

●可维护性高

●注释清晰

●文档齐全

2、常用的Coding技巧

●使用assert

●尽量使用const

●养成良好的编码风格

●添加必要注释

●避免编码陷阱

3、示范:模拟实现库函数strcpy

//原strcpy函数
#include
int main()
{
    char arr1[20]="xxxxxxxxxx";
    char arr2[]="hello";
    strcpy(arr1,arr2);
    printf("%s\n",arr1);    //输出hello
    return 0;
}

//模拟实现
void my_strcpy(char* dest,char* src)
{
     assert(src!=NULL);   //断言,若src为空会报错
     assert(dest!=NULL);  //断言,若dest为空会报错
     while(*src!='\0')
     {  
         *dest=*src;   //也可以写成*dest++=*src++;
         dest++;
         src++;
     }
     *dest=*src;     //也可以直接赋值'\0'
}
int main()
{
    char arr1[20]="xxxxxxxxxx";
    char arr2[]="hello";
    my_strcpy(arr1,arr2);
    printf("%s\n",arr1);
    return 0;
}

const修饰指针变量时:

●const如果放在*左边,修饰的是*p,表示指针指向的内容,是不能通过指针来改变的,但是指针变量本身是可以修改的。如:const int* p=&num;

●const如放在*右边,修饰的是指针变量p,表示指针变量,不能被改变,但是指针指向内容可以被改变。如:int* const p=&num;

六、编程常见的错误

●编译错误

直接看错误提示信息就可解决问题。较简单。

●链接型错误

一般是标示符名不存在或者拼写错误。

●运行时错误

借助调试,逐步定位问题。

你可能感兴趣的:(C语言入门,c语言)