首页 > 其他分享 >C语言——调试技巧

C语言——调试技巧

时间:2024-04-05 17:04:50浏览次数:20  
标签:Node head 技巧 C语言 current append 断点 调试

1.Debug和Release的介绍


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

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

2.调试快捷键

最常使用的几个快捷键:
F5
启动调试,经常用来直接调到下一个断点处

(下一个断点是程序逻辑上的下一个断点,进入断点循环后相当于F11);
F9
创建断点和取消断点 断点的重要作用,可以在程序的任意位置设置断点。这样就可以使得程序在想要的位置随意停止执行,继而一步步执行下去。
F10
逐过程,通常用来处理一个过程,一个过程可以是一次函数调用,或者是一条语句
F11
逐语句,就是每次都执行一条语句,但是这个快捷键可以使我们的执行逻辑进入函数内部(这是最常用的)。
CTRL + F5
开始执行不调试,如果你想让程序直接运行起来而不调试就可以直接使用

3.调试时查看程序当前信息

1.查看临时变量的值 

在调试开始之后,用于观察变量的值

 2.查看内存信息


在调试开始之后,用于观察内存信息。

3.查看调用堆栈 

通过调用堆栈,可以清晰的反应函数的调用关系以及当前调用所处的位置

4. 查看汇编信息

在调试开始之后,有两种方式转到汇编: (1)第一种方式:右击鼠标,选择【转到反汇编】: (2)第二种方式:可以切换到汇编代码

 5.查看寄存器信息

可以查看当前运行环境的寄存器的使用信息

4.调试C语言实现单链表的简单示例

#include <stdio.h>
#include <stdlib.h>

// 定义节点结构体
typedef struct Node {
    int data;
    struct Node* next;
} Node;

// 在链表末尾插入节点
void append(Node** head, int data) {
    Node* newNode = (Node*)malloc(sizeof(Node));
    newNode->data = data;
    newNode->next = NULL;

    if (*head == NULL) {
        *head = newNode;
    } else {
        Node* current = *head;
        while (current->next != NULL) {
            current = current->next;
        }
        current->next = newNode;
    }
}

// 遍历链表并打印所有节点的值
void printList(Node* head) {
    Node* current = head;
    while (current != NULL) {
        printf("%d ", current->data);
        current = current->next;
    }
    printf("\n");
}

int main() {
    Node* head = NULL;

    append(&head, 1);
    append(&head, 2);
    append(&head, 3);
    append(&head, 4);
    append(&head, 5);

    printList(head);

    return 0;
}
 

上述代码实现了一个简单的单链表,包含两个函数:append用于在链表末尾插入节点,printList用于遍历并打印链表中所有节点的值。

要在VS中调试这段代码,可以按照以下步骤进行:

  1. 打开Visual Studio,并创建一个新的C语言项目。
  2. 将上述代码复制到项目中的.c文件中(例如main.c)。
  3. 在需要设置断点的行的左侧行号部分单击,或者按下F9键,设置断点。在这个示例中,我们可以在printList(head)行上设置断点,以便在打印链表之前停止程序执行。
  4. 单击Start Debugging(或按下F5)开始调试程序。
  5. 程序将在设置的断点处停止执行。此时,您可以使用调试工具栏上的按钮(例如Step OverStep IntoStep Out)逐行执行代码,查看变量的值以及程序的执行流程。
  6. 在调试过程中,您可以在Locals窗口中查看变量的值,或者通过鼠标悬停在变量上来查看其当前值。
  7. 调试完成后,您可以点击Stop Debugging按钮(或按下Shift+F5)结束调试过程。

通过以上步骤,您可以使用VS进行C语言单链表代码的调试,并观察程序的执行过程和变量的值,以便定位和解决问题。

标签:Node,head,技巧,C语言,current,append,断点,调试
From: https://blog.csdn.net/2303_77720864/article/details/137402199

相关文章

  • C语言常见概念(一)
    1.C语言发展史,学习C语言的必要性?2.编译和链接是什么?过程是什么?3.各个编译器我该使用什么?vs的优势?4.main函数究竟是啥?5.关键字有哪些?要背诵吗?6.字符?asc码?字符计算?7.C语言的字符串?字符和字符串有何区别?8.sizeof和strlen?竟然有坑?9.转义字符是什么?平时怎么......
  • 从无到有开始创建动态顺序表——C语言实现
    顺序表的概念    顺序表的底层结构是数组,对数组的封装,实现了常用的增删改查等接口。在物理结构和逻辑结构都是连续的,物理结构是指顺序表在计算机内存的存储方式,逻辑结构是我们思考的形式,顺序表和数组是类似的,都是使用了连续的空间进行数据的保存,由于是连续的空间,所......
  • 小技巧
    关于浮点数相等的判断因为浮点数的精度计算太过复杂像3.14这样的数存在浮点型变量里存的可能是3.139999999,也有可能是3.140000001所以不能直接用“==”判断两个浮点数是否相等。在这种情况下,就允许判断两个浮点数为相等时,两数之间存在微小的误差这个“微小的误差”要取一个较......
  • C语言中循环语句while 中判断条件出现 || 和 && 的区别
    当while循环条件中出现||(逻辑或) ||两边的条件有任意一个满足条件时,即为真(也就是非0),循环继续,只有两边都满足条件时,即为假(也就是0),跳出循环  当while循环条件中出现&&(逻辑与)&& 两边都满足条件时,即为真(也就是非0,循环继续只要有任意一边满足条件,即为假(也就是0),跳出循环......
  • c | C语言
    C1.HelloWorld#include<stdio.h>intmain(){printf("HelloWorld");return0;}2.DataTypeInteger:charintshortlong/longlongUnsignedintegers:useunsignedkeywordbeforeIntegerFloatpointnumbers:floatdoubleStructures......
  • C语言数据结构专题--顺序表(1基础)
    前言我们在对C语言有一定的了解之后,我们就可以开始数据结构的学习了,数据结构多用指针、结构体、动态内存开辟等知识,若对这些知识还不太了解的朋友,就需要加深其理解了,那么废话不多说,我们正式开始本节的学习什么是数据结构数据结构是由"数据"和"结构"两个词相组合得到的......
  • 【C++风云录】音频编程艺术:掌握VST、JUCE、JACK和PortAudio的技巧
    声音之旅:音频开发者指南前言音频处理是现代软件开发中不可或缺的一部分,无论是音乐制作软件、游戏开发还是通信应用都需要对音频数据进行处理。本文将介绍几种常用的音频处理库和框架,帮助开发者更好地理解和应用于实际项目中。欢迎订阅专栏:C++风云录文章目录声音之......
  • 【C语言】函数递归——高手都在用的小技巧
    文章目录1.什么是递归2.递归的主要思想3.递归举例说明3.1n的阶乘3.2顺序打印⼀个整数的每⼀位4.递归与迭代4.1求第n个斐波那契数1.什么是递归递归简单来说就是一个函数自己调用自己,是不是感觉很莫名其妙,我第一次学习的时候就觉得为什么函数会自己调用自己......
  • 杨氏矩阵(C语言)
    文章目录问题技术名词解释思路关键代码运行代码问题有一个数字矩阵,矩阵的每行从左到右是递增的,矩阵从上到下是递增的,请编写程序在这样的矩阵中查找某个数字是否存在。要求:时间复杂度小于O(N);技术名词解释杨氏矩阵: 矩阵的每行从左到右是递增的,每列从上到下是递增的......
  • C语言—用EaxyX绘制实时钟表
     代码效果如图#undefUNICODE#undef_UNICODE#include<graphics.h>#include<conio.h>#include<math.h>#definewidth640#definehigh480#definePI3.14159intmain(){ initgraph(width,high); intcenter_x,center_y; center_x=width/2;......