c语言---访问越界之后死循环的原因

目录

  • 死循环的概念
  • 环境
  • 题目代码
  • 运行结果
  • 对代码发生情况进行解释
  • 对i的地址和arr[12]地址一样的解释
  • 注意
  • 总结

死循环的概念

简单来说,死循环就是指无法靠自身的控制终止循环,在编程中,则是靠自身控制无法终止的程序。即在某一时刻,当程序遇到循环判断语句使条件一直成立时,导致此时该程序始终在执行,跳不出循环,程序不能自己正常结束。

环境

在这里插入图片描述

在VS2022、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("牛逼\n");}return 0;
}

运行结果

在这里插入图片描述
在这里可以看到一直在打印牛逼这两个字,这就是进入了程序死循环。

对代码发生情况进行解释

对这个代码进行调试按F10走起,到下面这里
在这里插入图片描述
可以看到现在已经打印了10个牛逼
在这里插入图片描述
然后我们再继续按F10看看会怎么样呢?
在这里插入图片描述
可以看到i的值也跟着arr[12]一起变成0了。那么为什么i也会跟着改呢?但凡是不是i不改的话,i是不是通过i++,然后就变成13了就跳出了这次循环。但是并没有这样,那为什么看到i的值也跟着arr[12]一起变成0了呢?难道i和arr[12]在同一块空间?
为了验证这个问题,我们取i的地址和arr[12]的地址,
在这里插入图片描述

可以看出i的地址和arr[12]的地址一模一样,这就说明,改arr[12],i也会跟着改。然后又重新开始,这个i永远也不可能等于13,然后就出现了程序死循环。

对i的地址和arr[12]地址一样的解释

1.栈区内存的使⽤习惯是从⾼地址向低地址使⽤的,所以变量i的地址是
较⼤的。arr数组的地址整体是⼩于i的地址。
2. 数组在内存中的存放是:随着下标的增⻓,地址是由低到⾼变化的。所以根据代码,就能理解为什么是左边的代码布局了。如果是左边的内存布局,那随着数组下标的增⻓,往后越界就有可能覆盖到i,这样就可能造成死循环的。这⾥肯定有人有疑问:为什么i和arr数组之间恰好空出来2个整型的空间呢?这⾥确实是巧合,在不同的编译器下可能中间的空出的空间⼤⼩是不⼀样的,代码中这些变量内存的分配和地址分配是编译器指定的,所以的不同的编译器之间就有差异了。所以这个题⽬是和环境相关的。
在这里插入图片描述
从这个理解我们能够体会到调试的重要性,只有调试才能观察到程序内部执⾏的细节,就像医⽣给病⼈做B超,CT⼀样。

注意

栈区的默认的使⽤习惯是先使⽤⾼地址,再使⽤低地址的空间,但是这个具体还是要编译器的实现,⽐如:
在VS上切换到X64,这个使⽤的顺序就是相反的,在Release版本的程序中,这个使⽤的顺序也是相反的。
用VS2022、X64、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("牛逼\n");}return 0;
}

这个题目代码是在环境(VS2022、X86、Debug)的环境下会出现程序死循环,再次强调这个题目代码强烈依赖环境.。
在这里插入图片描述
欧耶!!!!!我学会啦!!!!!!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/664656.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uniapp基于Android平台的校园生活服务交流论坛系统(二手,失物招领 -跑腿) 小程序hbuiderx

作为一款APP的校园论坛系统&#xff0c;面向的是大多数学者&#xff0c;软件的界面设计简洁清晰&#xff0c;用户可轻松掌握使用技巧。在调查之后&#xff0c;获得用户以下需求&#xff1a; &#xff08;1&#xff09;用户注册登录后&#xff0c;可进入系统解锁更多功能&#x…

Python中的Statsmodels库实际案例解析1:市场营销效果分析

在现代商业环境中,了解和评估市场营销活动的效果对于企业来说至关重要。它不仅帮助企业优化广告支出,还能够提高市场策略的整体效率。本文将通过一个实际案例,展示如何使用Python中的Statsmodels库来进行市场营销效果的分析。 写在开头 市场营销效果分析对于评估和优化广告…

【从零开始的rust web开发之路 四】rust语言tokio异步使用redis教程

文章目录 前言一、首先引入依赖二、创建redis客户端三、相关操作设置值mset设置多个key值设置含有过期时间的值如果key不存在才设置获取基本类型值删除一个键删除多个键判断键是否存在 如何使用json序列化导入相关依赖代码相关实例 总结 前言 使用rust写web&#xff0c;自然是…

Windows网络常用的11个命令,ping、tracert、arp、ipconfig、netstat、telnet等

1&#xff0e;ping命令 ping是个使用频率极高的实用程序&#xff0c;主要用于确定网络的连通性。ping能够以毫秒为单位显示延迟。如果应答时间短&#xff0c;表示数据报不必通过太多的路由器或网络&#xff0c;连接速度比较快。ping还能显示TTL&#xff08;Time To Live&#…

AspNet web api 和mvc 过滤器差异

最近在维护老项目。定义个拦截器记录接口日志。但是发现不生效 最后发现因为继承的 ApiController不是Controller 只能用 System.Web.Http下的拦截器生效。所以现在总结归纳一下 Web Api: System.Web.Http.Filters.ActionFilterAttribute 继承该类 Mvc: System.Web.Mvc.Ac…

客户端和服务端的简介

Client 和 Server 客户端&#xff08;Client&#xff09; 或称用户端&#xff0c;是指与服务器相对应&#xff0c;为客户提供本地服务的程序。除了一些只在本地运行的应用程序之外&#xff0c;一般安装在客户机上&#xff0c;需要与服务端互相配合运行。例如&#xff1a;下载 Q…

ChatGPT炸裂了

优质内容&#xff1a;ChatGPT太炸裂了 hello&#xff0c;我是小索奇 很多人在使用ChatGPT时遇到了两个主要问题&#xff0c;导致他们觉得这个工具并没有带来太多实际价值。首先&#xff0c;许多人发现ChatGPT的回答缺乏深度&#xff0c;缺乏实用性。其次&#xff0c;一些人在使…

MySQL操作问题汇总

MySQL操作问题汇总 无法远程连接Ubuntu的MySQL 无法远程连接Ubuntu的MySQL 提示&#xff1a;MySQL默认只允许本地连接&#xff1a;localhost 解决&#xff1a; #1.修改配置文件 #/etc/mysql/mysql.conf.d/mysqld.cnf > cp /etc/mysql/mysql.conf.d/mysqld.cnf /etc/mysql/…

WebSocketServer依赖注入问题

WebSocketServer加入spring的bean管理 问题 @Component @ServerEndpoint("/webSocket/{topic}") @Slf4j public class WebSocketServer {@Autowiredprivate WsHandle wsHandle;} 前面使用@ServerEndpoint注册一个websocket服务端,然后发现wsHandle依赖注入失败,…

STM32GPIO输入(按键控制LED、光敏电阻控制蜂鸣器实例)

文章目录 一、介绍传感器模块介绍硬件电路c语言数据类型 二、实例按键控制LED接线图代码实现 光敏电阻控制蜂鸣器组装线路代码实现 相关函数解释 一、介绍 传感器模块介绍 硬件电路 上两种按下时为0&#xff0c;下两种按下时为1。 c语言数据类型 现在常用stdint头文件所定…

BeanDefinitionRegistry学习

Spring版本5.1.x 简介 在Spring框架中&#xff0c;BeanDefinitionRegistry是一个接口&#xff0c;它主要用于向注册表中注册BeanDefinition实例&#xff0c;完成注册的过程。该接口的主要方法是registerBeanDefinition&#xff0c;用于将一个BeanDefinition实例注册到注册表中…

【zip密码】zip压缩包的打开密码忘了,怎么办?

Zip压缩包设置了密码&#xff0c;解压的时候就需要输入正确对密码才能顺利解压出文件&#xff0c;正常当我们解压文件或者删除密码的时候&#xff0c;虽然方法多&#xff0c;但是都需要输入正确的密码才能完成。忘记密码就无法进行操作。 那么&#xff0c;忘记了zip压缩包的密…

一张证书如何改变职业生涯?程序员必看!

随着信息产业的迅猛发展&#xff0c;对行业人才的需求也在逐年扩大。据统计&#xff0c;未来五年&#xff0c;我国对信息化人才的总需求量将高达1500万至2000万人。以软件开发为例&#xff0c;我国对软件人才的需求正以每年20%的速度递增&#xff0c;每年新增的需求接近百万。计…

1 初识JVM

JVM&#xff08;Java Virtual Machine&#xff09;&#xff0c;也就是 “Java虚拟机”。 对于第三点功能&#xff1a;即时编译 常见的JVM 默认安装在JDK中的虚拟机为HotSpot&#xff1a;可以用“java -version”进行查看

云原生 API 网关链路追踪能力重磅上线

云原生API网关介绍 云原生 API 网关是腾讯云基于开源网关推出的一款高性能高可用的云原生 API 网关产品&#xff0c;作为云上流量入口&#xff0c;集成请求分发、API 管理、流量监控、访问限制等功能&#xff0c;是微服务架构和容器架构中的重要组件。 TSE 云原生 API 网关提…

数据分析基础之《pandas(4)—pandas画图》

1、DataFrame.plot(xNone, yNone, kindline) 说明&#xff1a; x&#xff1a;设置x轴标签 y&#xff1a;设置y轴标签 kind&#xff1a; line 折线图 bar 柱状图 hist 直方图 pie 饼图 scatter 散点图 # 找到p_change和turnover之间的关系 data.plot(xvolume, yturnover, kinds…

【数据库】分区的优点和缺点

​ &#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;数据库 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 优点&#xff1a; 缺点&#xff1a; 结语 我的其他博客 ​ 前言 数据库中的分区技术为处理大规模数据提供了一种有效的手段…

五大浏览器内核及代表浏览器,一文讲透!

Hi,我是贝格前端工场&#xff0c;在进行web前端开发的时候&#xff0c;浏览器兼容性一直是让所有前端工程师头疼的问题&#xff0c;其根源在于不同的浏览器应用了不同的内核&#xff0c;其对html、css、js的解析规则也是不一样的&#xff0c;作为前端开发的你&#xff0c;如果不…

【核心网】【LTE】附着信令流程报文 - 关键字段内容

目录 1. (S1AP/NAS-EPS) --> InitialUEMessage, Attach request, PDN connectivity request 2. (DIAMETER) --> cmd=3GPP-Authentication-Information Request(318) flags=RP-- appl=3GPP S6a/S6d(16777251) h2h=

一文掌握单基因GSEA富集分析

本期教程 本期教程原文:一文掌握单基因GSEA富集分析 | gseaGO and gseaKEGG 写在前面 关于GSEA分析,我们在前期的教程单基因GSEA富集分析 | 20220404有出过类似的分享。今天,我们也结合相关的资源整理出一篇关于GSEA的教程及出图教程。每个方法的教程很多,我们大家结合自…