一段诡异的代码——调试的重要性

梦里梦外; 2022-12-29 06:35 180阅读 0赞

调试

  • 调试
  • 调试的步骤
    • 一段诡异的代码
      • 调试

调试

调试(Denugging/Debug),又称为出错,是发现和减少计算机程序或电子仪器设备中程序错误的一个过程。

调试的步骤

  • 发现程序错误的地方
  • 以隔离、消除等方式对错误进行定位
  • 确定错误产生的原因
  • 提出纠正错误的解决办法
  • 对程序错误予以改正

一段诡异的代码

  1. #define _CRT_SECURE_NO_WARNINGS 1
  2. #include <stdio.h>
  3. int main()
  4. {
  5. int i = 0;
  6. int arr[10] = { 0 };
  7. for (i = 0; i <= 12; i++)
  8. {
  9. arr[i] = 0;
  10. printf("hello world!\n");
  11. }
  12. return 0;
  13. }

表面上,这段代码,就是简单的数组越界,arr数组只有0——9;可是for循环,访问到了12,然后程序应该就结束了。
但是实际结果,程序陷入了死循环。如下图:
在这里插入图片描述
我们可以将数字i打印:
如下:

  1. #define _CRT_SECURE_NO_WARNINGS 1
  2. #include <stdio.h>
  3. int main()
  4. {
  5. int i = 0;
  6. int arr[10] = { 0 };
  7. for (i = 0; i <= 12; i++)
  8. {
  9. arr[i] = 0;
  10. printf("hello world!%d\n",i);
  11. }
  12. return 0;
  13. }

在这里插入图片描述
可以看到,上面代码,一直从0打印到11,然后又从0开始,陷入死循环中。这是为什么呢?
我们一直看,一直看,也看不出来,这就需要调试了。

调试

我们知道,在栈区,变量为向下生长的(即:地址为高–>低),因为变量i先定义,所以i的地址,相对于后定义的arr地址要高。
虽然在栈区,变量是向下生长的,但是数组的地址是由低到高的。
打开调试:找到arr和i在内存中的地址。经过初始化后,arr和 i在内存中,都初始化为0;

在这里插入图片描述
进一步调试:
在这里插入图片描述
我们可以看到,for循环中i一直++,当i==12得到时候,数组越界,将arr[12]和i的地址中的数改为0;这样i又为0;这样程序就会一直死循环。

所以,简单的错误,我们也没有想到会造成死循环,如果仅凭眼睛看, 很难发现错误,所以调试还是很重要的。

发表评论

表情:
评论列表 (有 0 条评论,180人围观)

还没有评论,来说两句吧...

相关阅读

    相关 调试Python代码时遇到诡异错误

    在调试Python代码时,可能会遇到各种诡异的错误。这些错误往往难以直接定位到问题所在,需要一定的技巧和经验来解决。以下是一些常见的诡异错误及其调试方法: 1. **语法错误

    相关 错误调试

    不同于在Windows下编程,gcc编程中经常会出现段错误,段错误出现的几种原因: 访问了不存在的内存空间 访问了系统保护的内存地址(比如0号地址) 访问只读的内存地址:

    相关 集大成thymeleaf代码

    我在工作中正式用java有几个月的时间了吧,其中thymeleaf也算比较大的大头。虽然我不喜欢这个玩意,但谋生使然,现在来做一个总结。我发现我有一段代码,几乎囊括了我现阶段的