实用调试技巧零基础搞定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的主要内容,如果未能解决你的问题,请参考以下文章

C语言学习笔记实用的调试技巧

08实用调试技巧

C语言进阶学习笔记七程序执行+调试技巧(实用技巧篇)

C语言有这个就够了七.实用调试技巧

零基础搞定C语言——10

vs环境——C语言实用调试技巧