首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【调试实战】阶乘求和结果不对?手把手教你用VS揪出“幽灵”变量

【调试实战】阶乘求和结果不对?手把手教你用VS揪出“幽灵”变量

作者头像
码途随笔
发布2026-01-12 19:50:49
发布2026-01-12 19:50:49
1030
举报

一、bug与debug

bug本意是”虫子“的意识,现在一般是在电脑系统和程序中,隐藏着一些未被发现和隐藏的缺陷和问题,称为程序漏洞。 debug:找到问题的过程。当发现问题时,找到问题,并修复问题,调试一个程序,首先是承认出现了问题,然后通过逐过程的调试,或者隔离和屏蔽代码的方式,找到问题的位置,在修复代码,重新测试。

二、Debug和Release版本

注:测试测的是Release版本

三、VS调试过程

3.1 环境的设置

调试环境的设置为Debug版本

原因举例:当F10调试代码,遇到for循环,Release版本不会进入for循环,Debug版本会进入到里面,一步一步的执行

3.2 调试快捷键

F9+F5配合使用:断点加调试 补充:F9打印断点,还可以设置条件断点

F5:来到执行逻辑上的下一个断点处 (不是物理上的),想来到物理上的断点,可以把上一个断电取消掉 F5:调试 Ctrl+F5:运行 细致观察:F10:逐过程,处理一次函数调用或一条语句 F11:逐语句,可以进入到函数调用 F10+F11配合使用

3.3 监视与内存观察

前提是:调试起来才能监视和看内存

内存中的数据是倒着存放的

四、调试案例

4.1 求阶乘和

求1!+2!+3!+4!+…10!的和 错误解法

代码语言:javascript
复制
#include<stdio.h>
int main()
{
   int n = 0;
   int i = 0;
   int ret = 1;
   int sum = 0;
   for (n = 1; n <= 3; n++) 
   {
   	for (i = 1; i <= n; i++)
   	{
   		ret *= i;
   	}
   	sum += ret;
   }
   printf("%d", sum);
   return 0;
}

调试的步骤:弄清这个程序要完成什么功能,出现了什么现象,再去分析 预期的结果是:9,但是实际的结果是:15 经过调试(跟着程序走,看是否是我们的预期效果 ):

n等于3时,i等于4时,说明ret此时为3的阶乘,但此时ret为12不等于9,说明ret一开始是有值的,原因是ret是全局变量,会有累计的效果 解决办法: 在每次计算前,初始化ret的值

4.2 数组越界产生死循环

调试环境:X86和Debug版本

题目:运行以下代码,结果是啥?

代码语言:javascript
复制
#include<stdio.h>
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[i]i为10或11是改的是随机数,当i为12,发现arr[i]也为12,这不是巧合,说明arr[i]i为同一个空间

验证:

上述创建的都是局部变量(在栈区上) 底层原理:栈区的使用习惯是先高地址再低地址(先创建i,在创建arr数组),而数组在存储的时候,随着下标的增长,地址是由低变高的.

iarr数组中间差几个地址完全取决于编译器 另外:

验证:当换成X64,i的地址比arr的地址小

4.3 数组中的调试

当代码量较大时,一步一步调试较麻烦,在有你觉得有问题的地方,打上断点,按F5可以跳到此处,在函数内部打断点,快速跳转到函数

遇到数组传参

当进到函数里面时,里面的内容就看不见了(如下图所示)

解决方法:调试进入函数,如何在监视窗口观察数组的内容:数组名,n的形式

二维数组一样,不同的是只能观察第一行

4.4 案例总结

五、三大编译错误类型

5.1 编译型错误

双击错误会跳到错误的地方

5.2 链接型错误

编译时不会报错,生成解决方案时才会报错 双击错误不会跳到错误的地方

5.3 运行时错误

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-10-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、bug与debug
  • 二、Debug和Release版本
  • 三、VS调试过程
    • 3.1 环境的设置
    • 3.2 调试快捷键
    • 3.3 监视与内存观察
  • 四、调试案例
    • 4.1 求阶乘和
    • 4.2 数组越界产生死循环
    • 4.3 数组中的调试
    • 4.4 案例总结
  • 五、三大编译错误类型
    • 5.1 编译型错误
    • 5.2 链接型错误
    • 5.3 运行时错误
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档