当前位置: 首页 > news >正文

【C语言初阶(20)】调试练习题

文章目录

  • 前言
  • 实例1
  • 实例2

前言

  • 在我们开始调试之前,应该有个明确的思路;
  • 程序是如何完成工作的、变量到达某个步骤时的值应该是什么、出现的问题大概会在什么位置。
  • 这些东西在调试之前都需要先确认下来,不然自己都不知道自己在调试个什么东西了。

实例1

题目内容

  • 求 1!+2!+3! …+ n! ;不考虑溢出。

使用调试分析出下面代码的问题是什么

  • 注意:不要用经验来判断问题出在哪,全当第一次遇见这些代码,光瞪眼肯定是没法解决问题的。
int main()
{int i = 0;int sum = 0;			//保存最终结果int n = 0;int ret = 1;			//保存 n 的阶乘scanf("%d", &n);		//输入 3,结果应该是:1! + 2! +3! = 9for(i=1; i<=n; i++){int j = 0;for(j=1; j<=i; j++){ret *= j;}sum += ret;		//将 1 到 i 之间的数字累乘到 ret 上去就是 i 的阶乘}printf("%d\n", sum);return 0;
}
  • 结果显然和我们想象中的有所出入。

在这里插入图片描述

调试分析

  • 调试过程中,我们需要观察 sum、ret、i、n 、j 这几个变量的值的变化。
    • 调试过程中需要我们先给 n 输入一个值,此时已经给了个 3 给 n。

在这里插入图片描述

  • 第一次循环,i 初始化为 1,j 初始化为 1,满足条件 j <= i,进入内层循环。将 j = 1 乘到 ret 上,此时 ret 变为 1。

在这里插入图片描述

  • 内循环完一遍之后 j++ 变成了 2。2 <= i 的条件就不成立了,将算出的 1 的阶乘 + 到 sum 上去。此时 sum 变成了 1.

在这里插入图片描述

  • 求完一遍阶乘之后,令 i++ 变成了 2,那么内循环就要算出 2 的阶乘,重新令 j 初始化为 1,满足循环条件,将 j = 1 乘到 ret 上去,ret 的结果也是 1。

在这里插入图片描述

  • 然后 j++ 变成 了 2,将 j = 2 乘 到 ret 上,此时 ret 就变成了 2。

在这里插入图片描述

  • j++ 变成了 3,不满足循环条件 j <= i,退出循环,然后将 ret = 2 累加到 sum 上去,此时 sum 变成了 3。目前为止还没有任务问题。

在这里插入图片描述

  • 累加完了之后让 i++ 变成了 3,满足 i <= n(3) 的条件,现在要求 3 的阶乘。让 j 初始化为 1 从 1 开始 一直乘到 3。将 1 乘给 ret 之后发现,ret 的值变成 2,开始有点不对劲了。

在这里插入图片描述

  • j++ 变成 2,将 j = 2 乘 给 ret 此时 ret 变成了 4,然后 j++ 变成了 3,将 3 继续乘到 ret 上,此时 ret 变成了 12,ret = 12 明显不是 3 的阶乘。所以问题应该就是出在这里了。
  • 因为 ret 是在循环体外面创建的,在循环过程中 ret 的值被改了就回不到 1 了,用会变的值来进行累乘,结果肯定不如人意了。

在这里插入图片描述
在这里插入图片描述

  • 最终将 ret = 12 加到 sum 上去 3 + 12 结果 15 就这么出来了。

在这里插入图片描述

代码修改

  • 将在循环体外部的 ret 放到循环体内部,每次循环完一轮之后都让 ret 的值重新变回 1,就不会影响最终结果了。

在这里插入图片描述

实例2

分析下面代码出现死循环的原因

  • 前提:该代码仅限在 VS + X86 环境 + Debug 模式下验证。
#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("hello word!\n");}return 0;
}

在这里插入图片描述

调试分析

  • 很明显数组访问是直接越界了,但是前面 9 次的赋值是没有问题的。

在这里插入图片描述

  • 再观察 i 的值,在数组越界到 10、11 的时候,i 的值都还算正常。可唯独到了 arr[12] 的时候,i 的值居然被改成 0;
  • 也就是说,i 和 arr[12] 挂上了钩,arr[12] 只要被赋值成 0,i 也会被改成 0,i 无法自增到 13 自然就无法退出循环直接就导致死循环了。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 此时再观察 arr[12] 以及 i 的地址会发现,这两个家伙在你不知情的情况下已经住到同一个地址去了,难怪将 arr[12] 改为 0 会让 i 也跟着一块变。

在这里插入图片描述

代码分析

  • 现在要创建一个局部变量 i ,为 i 在栈上先分配一块空间;
  • 然后再创建数组 arr ,为 arr 分配一快空间;
  • 局部变量都是按照的方式(从搞地质向低地址使用)创建的,也就是说先被创建出来的 i 在内存中 在 arr 数组的下面。

在这里插入图片描述

  • 数组按照往下越界得情况来看的话,arr[12] 刚好就越界到了 i 所在的空间。
  • 前提中提到过的特殊情况下,先创建的 i 与 后创建的 arr 数组之间就是隔着两个整型的空间,所与才会越界越着越着就让摸到 i 了。

在这里插入图片描述

问题解决方案

  • 这段代码最大的问题就是数组的越界访问,没啥可说的,把这个改过来就行了。
#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 < 10; i++){arr[i] = 0;printf("hello word!\n");}return 0;
}

相关文章:

【C语言初阶(20)】调试练习题

文章目录 前言实例1实例2 前言 在我们开始调试之前&#xff0c;应该有个明确的思路&#xff1b;程序是如何完成工作的、变量到达某个步骤时的值应该是什么、出现的问题大概会在什么位置。这些东西在调试之前都需要先确认下来&#xff0c;不然自己都不知道自己在调试个什么东西…...

MicroPython ESP32网页实时更新DHT11数据显示

MicroPython ESP32网页实时更新DHT11数据显示 &#x1f4cc;相关篇《MicroPython ESP32 读取DHT11温湿度传感器数据》&#x1f4cd;《【Micropython esp32/8266】网页点灯控制示例》 ✨本例综合以上两篇文章内容实现&#xff1a;在本地网页中显示DHT11温度传感器数据。可以做到…...

JavaWeb之HTML基础篇(一)

系列文章目录 HTML基础篇&#xff08;一&#xff09; 文章目录 系列文章目录HTML基础篇&#xff08;一&#xff09;[TOC](文章目录) 前言一、HTML简介1.1介绍1.2HTML文件的书写规范1.3 HTML标签介绍1.4 HTML常见的标签 二、CSS的简介2.1css技术介绍2.2 CSS与HTML结合的三种方式…...

TVM_深度学习编译器

TVM_深度学习编译器 TVM所做的是要比传统compiler更偏上层的,你可以把它理解成source-to-source compiler,需要其他的后端(backend)来生成最后的指令。比如当编译的Target是Intel CPU时,翻译的顺序是Relay IR -> TVM IR/ Halide IR -> LLVM IR,之后交给LLVM生成最后…...

Flutter InheritedWidget 共享状态管理

InheritedWidget和React中的context功能类似&#xff0c;可以实现跨组件数据的传递。 定义一个共享数据的InheritedWidget&#xff0c;需要继承自InheritedWidget 这里定义了一个of方法&#xff0c;该方法通过context开始去查找祖先的HYDataWidget&#xff08;可以查看源码查找…...

什么是反射?Java反射?反射的优缺点

目录 什么是反射&#xff08;Reflection &#xff09;&#xff1f;Java反射&#xff1f;反射的优缺点获取Class对象的三种方式&#xff1a;java反射技术的应用场景 什么是反射&#xff08;Reflection &#xff09;&#xff1f; 主要是指程序可以访问、检测和修改它本身状态或行…...

小红书2020校招测试开发后端笔试题卷三

//完全背包求组合数 #include <iostream> #include<vector> #include<set> #include<map> #include<algorithm> using namespace std; int value[300]; // vector<int>vis; // vector<int>vis1; map<vector<int>,int>m…...

python数据可视化Matplotlib

1.绘制简单的折线图 # -*- coding: utf-8 -*- import matplotlib.pyplot as pltinput_values [1, 2, 3, 4, 5] squares [1, 4, 9, 16, 25] plt.style.use(seaborn) fig, ax plt.subplots() ax.plot(input_values, squares, linewidth3) # 线条粗细# 设置图表标题并给坐标…...

firewalld防火墙

firewalld防火墙 它属于包过滤防火墙。工作在网络层&#xff0c;是centos7自带的默认防火墙。主要是取代iptables。 firewalld的两种配置模式&#xff1a; 分别是运行时配置和永久配置。 iptable是静态防火墙 firewalld是动态防火墙 它是按照区域来划分的&#xff0c;有9…...

iMacros WebBrowser Component for .NET

iMacros WebBrowser Component for .NET 在几分钟内实现应用程序自动化 快速轻松地将iMacro集成到您的应用程序中。不需要单独的安装程序。 无缝集成 iMacros与您的.NET应用程序无缝集成&#xff0c;作为Microsoft WebBrowser控件的替代品。它甚至可以用作每个.NET应用程序中的…...

3,堆,桶排序,排序总结【p4-p5】

桶排序&#xff0c;排序总结 3.1堆3.1.1堆结构3.1.1.1完全二叉树3.1.1.2堆分为大根堆和小根堆3.1.1.2.1案例1-去掉最大数字&#xff0c;使剩下的数字依然是大根堆3.1.1.2.2案例23.1.1.2.3案例33.1.1.2.4案例4-方便制造大根堆方法 3.1.2堆排序3.1.2.1案例-堆排序的扩展3.1.2.1.1…...

使用langchain与你自己的数据对话(四):问答(question answering)

之前我已经完成了使用langchain与你自己的数据对话的前三篇博客&#xff0c;还没有阅读这三篇博客的朋友可以先阅读一下&#xff1a; 使用langchain与你自己的数据对话(一)&#xff1a;文档加载与切割使用langchain与你自己的数据对话(二)&#xff1a;向量存储与嵌入使用langc…...

如何快速开拓海外华人市场?附解决方案!

开拓华人市场对于企业来说是非常必要的。华人市场庞大且潜力巨大&#xff0c;拥有巨额的消费能力。随着华人经济的不断增长&#xff0c;越来越多的企业开始意识到华人市场的重要性。 通过开拓华人市场&#xff0c;企业可以获得更多的销售机会&#xff0c;并且在竞争激烈的市场…...

【云原生-制品管理】制品管理的优势

制品介绍制品管理-DevOps制品管理优势总结 制品介绍 制品管理指的是存储、版本控制和跟踪在软件开发过程中产生的二进制文件或“制品”的过程。这些制品可以包括编译后的源代码、库和文档&#xff0c;包括操作包、NPM 和 Maven 包&#xff08;或像 Docker 这样的容器镜像&…...

Java爬虫----HttpClient方式(获取数据篇)

目录 一、爬虫的定义 二、获取数据 &#xff08;1&#xff09;基于Get方式的请求&#xff08;无参&#xff09; &#xff08;2&#xff09;基于Get方式请求&#xff08;有参&#xff09; &#xff08;3&#xff09;基于Post方式的请求&#xff08;无参&#xff09; &…...

计算机视觉实验:图像增强应用实践

本次实验主要从基于统计、函数映射的图像增强方法和基于滤波的图像增强方法两种方法中对一些图像增强的算法进行实现。主要的编程语言为python&#xff0c;调用了python自带的PIL图像库用于读取图像&#xff0c;利用numpy进行图像运算&#xff0c;最后使用opencv第三方库进行对…...

ES6:Generator函数详解

ES6&#xff1a;Generator函数详解 1、 概念2、yield表达式2.1 yield 语句与 return 语句区别2.2 Generator函数不加yield语句&#xff0c;这时变成了一个单纯的暂缓执行函数2.3 yield 表达式只能用在 Generator 函数里面&#xff0c;用在其它地方都会报错2.4 yield 表达式如果…...

前端小练-产品宣传页面

文章目录 前言页面结构固定钉头部轮播JS特效 完整代码总结 前言 经过一个月的爆肝&#xff0c;花费了一个月&#xff08;期间还花费了将近半个月的时间打比赛&#xff0c;还要备研&#xff09;算是把数二高数的内容强化了一遍&#xff0c;接下来刷熟练度即可&#xff0c;可惜的…...

arm学习之stm32设备树学习-中断控制led灯亮灭+字符设备指令控制led灯亮灭

中断控制led灯亮灭 驱动文件源码 led-key.c #include<linux/init.h> #include<linux/module.h> #include<linux/of.h> #include<linux/of_gpio.h> #include<linux/gpio.h> #include<linux/of_irq.h> #include<linux/interrupt.h> s…...

快速开发框架若依的基础使用详解

Hi I’m Shendi 快速开发框架若依的基础使用详解 最近在为公司制作新的项目&#xff0c;经过了一段时间的技术沉淀&#xff0c;我开始尝试接触市面上用的比较多的快速开发框架&#xff0c;听的最多的当属若依吧 于是就选用了若依 介绍 为什么选&#xff1f;目的是为了提高开发…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

【网络安全产品大调研系列】2. 体验漏洞扫描

前言 2023 年漏洞扫描服务市场规模预计为 3.06&#xff08;十亿美元&#xff09;。漏洞扫描服务市场行业预计将从 2024 年的 3.48&#xff08;十亿美元&#xff09;增长到 2032 年的 9.54&#xff08;十亿美元&#xff09;。预测期内漏洞扫描服务市场 CAGR&#xff08;增长率&…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码

目录 一、&#x1f468;‍&#x1f393;网站题目 二、✍️网站描述 三、&#x1f4da;网站介绍 四、&#x1f310;网站效果 五、&#x1fa93; 代码实现 &#x1f9f1;HTML 六、&#x1f947; 如何让学习不再盲目 七、&#x1f381;更多干货 一、&#x1f468;‍&#x1f…...

C++:多态机制详解

目录 一. 多态的概念 1.静态多态&#xff08;编译时多态&#xff09; 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1&#xff09;.协变 2&#xff09;.析构函数的重写 5.override 和 final关键字 1&#…...