实用调试技巧零基础搞定C语言——13
Posted 林慢慢i
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实用调试技巧零基础搞定C语言——13相关的知识,希望对你有一定的参考价值。
本期主要内容是实用调试技巧
文章目录
调试的基本步骤
1.发现程序存在错误
2.以隔离、消除等方式对错误进行定位
3.确定错误产生的原因
4.提出纠正错误的解决方法
5.对程序错误予以改正,重新测试
Debug和Release的介绍
Debug通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。
Release称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。
我们所说的调试就是在Debug版本的环境中,找代码中潜伏的问题的一个过程。
最常用的几个快捷键:
F5
启动调试,经常用来直接跳到下一个断点处
F9
创建断点和取消断点的重要作用,可以在程序的任意位置设置断点。
F10
逐过程,通常用来处理一个过程,一个过程可以是一次函数调用,或者是一条语句
F11
逐语句,就是每次都执行一条语句,但是这个快捷键可以使我们的执行逻辑进入函数内部
CTRL+F5
开始执行且不调试
调试时查看程序当前信息
查看调用堆栈
查看汇编信息
查看局部变量
查看寄存器信息
编译常见的错误
常见错误分类:
编译型错误
直接看错误提示信息(双击),解决问题。或者凭借经验就可以搞定,easy。
链接型错误
看错误提示信息,主要在代码中找到错误信息的标识符,然后定位问题所在。一般是标识符名不存在或拼写错误。
运行时错误
不报错,只能借助调试,逐步定位问题,difficult!
温馨提示:
遇到报错莫慌,沉下心来,多调试积累经验!
练习题
实例1
#include <stdio.h>
int main()
{
int i = 0;
int arr[] = {1,2,3,4,5,6,7,8,9,10};
for(i=0; i<=12; i++)
{
arr[i] = 0;
printf("hello \\n");
}
return 0;
}
问:在VS_2019当中跑上述程序,会死循环输出hello,为什么?
答:i和arr都是局部变量,局部变量是在栈区上的,栈区内存使用习惯是:先用高地址空间,再使用低地址空间,而数组随着下标的增长地址由低到高变化,for循环中,i的内容是从0,一直增加到12,而数组只有10个空间,因此会越界。每次访问arr数组i号位置时,都会将该位置内容设置为0,当访问到arr[12]时,也会将该位置内容设置为0,而该位置恰好为i的位置,即a[12]恰巧将i设置为0,因此造成死循环。
实例2
调整数组使奇数全部都位于偶数前面。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
void swap(int a[] ,int sz)
{
int left = 0;
int right = sz - 1;
int temp = 0;
while (left < right)
{
while (a[left] % 2 == 1)//奇数就++下一个
{
left++;
}
while (a[right] % 2 == 0)//偶数就--前一个
{
right--;
}
//不然就互换
temp = a[left];
a[left] = a[right];
a[right] = temp;
}
}
int main()
{
int a[10] = { 1,58,5,9,5,2,3,4,56,42 };
int sz = 0;
int i = 0;
sz = sizeof(a)/sizeof(a[0]);
/*printf("%d", sz);*/
swap(a, sz);
for (i = 0; i < 10; i++)
{
printf("%d ", a[i]);
}
return 0;
}
实例3
模拟实现库函数strlen
int my_strlen(const char *str)
{
const char* a = str;
while (*a++)
{
;
}
return(a - str - 1);
}
实例4
模拟实现库函数strcpy
char my_strcpy(char* dest, char* src)
{
char* a = dest;
while (*a++ = *src++);
return(dest);
}
调试部分内容到此介绍结束了,感谢您的阅读!!!如果内容对你有帮助的话,记得给我三连(点赞、收藏、关注)——做个手有余香的人。
以上是关于实用调试技巧零基础搞定C语言——13的主要内容,如果未能解决你的问题,请参考以下文章