C语言数组越界导致无限循环

大奖也是你们的,感谢支持,不喜欢的请轻拍。过年抽奖我还是很期待的,每年公司的年会抽奖的时候,我总是能小中一把,有一年我还中了个一等奖,不知道大家对一等奖什么概念,中一等奖的概率非常低,集人品运气于一身的,我当时酝酿了全宇宙的力量,不说了,发功的时候真的非常累。

640?wx_fmt=png

就是这个截图,我看了下,感觉有点意思,赶紧就自己敲下代码看看是怎么回事,可惜的是,我怎么也没看到出现无限循环啊。

代码如下:

#include "stdio.h"int main()
{int a[10] , i;for(i = 1;i<= 10;i++){a[i] = 0;printf("%d %d\n",i,a[i]);}	return 0;
}

我先是在 dev c++ 上面试了下,结果如下640?wx_fmt=png

我这时候想,黄兄是不是忽悠我了,我要去成都叫他请我吃饭,然后我就给他评论

评论如下640?wx_fmt=png

竟然还有人给我的评论点赞了,啊啊啊啊啊啊~

不死心,赶紧又到Linux 下用 gcc编译 结果如下640?wx_fmt=png

还是没有无线循环,我要死了,要是在群里面讨论这个,我要是说不出来会不会丢脸一个晚上。

赶紧用大招,看看i的地址和a[i] 的地址

640?wx_fmt=png

看这个图,i等于 10的时候, &a[10] 的地址和 i的地址还是独立的,虽然 a[10]已经超过了 数组的范围,但是并没有对i造成任何影响。

然后,我脑子一响,突然顿悟发现这个代码的问题所在了,这个数组越界没有越过去,要是越过去了,侵犯了i的领土「内存地址」了肯定就死循环了。

代码修改一下

#include "stdio.h"int main()
{int a[10] , i;for(i = 1;i<= 12;i++){a[i] = 0;printf("%d %d\n",i,a[i]);}	return 0;
}
640?wx_fmt=png你看,你看,这样一越界过去,就产生了死循环,i一直都是0,怎么也跳不出for循环了。

看看内存分布640?wx_fmt=png上图中 i = 10的时候,&a[10] 还没有越界到 &i「i的地址」,等下一次循环 i = 11的时候,那 &a[11]  就等于 &i 了,a[11] = 0,其实也就是 i= 0,死循环也就是这样来了。

从这个例子我们可以明白一点,为什么数组不能越界操作了没?如果真的是项目里面的代码,要是编译器也不给出提示,那么你即将构造一个非常难排查的bug出来。

如果对上面的地址还是不感冒,可以看看这个图片

640?wx_fmt=png

a我们定义的是10的大小,但是我们使用 a[10],这个是越界操作,越界操作编译器不会提示编译出错,但是这样操作就可能侵犯到i的地址,实际上把i给赋值了,所以会导致i=0,一直跳不出for循环。

我们正常一个数组遍历会这样写

#include "stdio.h"int main()
{int i;int a[10];for(i = 0;i < sizeof(a)/sizeof(a[0]);i++){a[i] = 0;printf("%d %d %p %p\n",i,a[i],&i,&a[i]);}	return 0;
}

编译器就好像法律,约束着人们的行为,但是有些法律没有涉及到的,就很容易被打擦边球。

最后用这个代码看看内存的增长「一个读者奉献的」

#include <stdio.h>int main(void)
{#pragma pack (4)int j;int a[10];int i;#pragma pack()printf("a=%p &a[10]=%p &i=%p &a[-1]=%p &a[-2]=%p &j=%p\r\n",a, &a[10],&i,&a[-1],&a[-2],&j);return 0;
}

640?wx_fmt=png


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

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

相关文章

七月流水账

7.1-7.3 >< 7.4 看了一会儿李老大给的Caffe的教程 重配python qt vtk&#xff0c;大概是原来装了一个xxx&#xff08;忘记名字&#xff09;&#xff0c;然后位数有些不对&#xff0c;搞了好一阵 果然还是卸载重装好>< 然后又看了会儿Matlab神经网络工具箱怎么用 …

python绘制拟合回归散点图_机器学习之利用Python进行简单线性回归分析

前言&#xff1a;在利用机器学习方法进行数据分析时经常要了解变量的相关性&#xff0c;有时还需要对变量进行回归分析。本文首先对人工智能/机器学习/深度学习、相关分析/因果分析/回归分析等易混淆的概念进行区分&#xff0c;最后结合案例介绍如何利用Python进行简单线性回归…

十年经验教你如何学习嵌入式系统

一、如何学习嵌入式系统- - 嵌入式系统的概念着重理解“嵌入”的概念 &#xff0c;主要从三个方面上来理解。1、从硬件上&#xff0c;“嵌入”将基于CPU的处围器件&#xff0c;整合到CPU芯片内部&#xff0c;比如早期基于X86体系结构下的计算机&#xff0c;CPU只是有运算器和累…

php博客文章修改,wordpress博客如何快速修改文章阅读数

WordPress修改文章阅读次数可以通过插件来完成&#xff0c;下面我们以WP-PostViews插件演示如何修改文章阅读次数。WP-PostViews是一个非常常用的wordpress插件&#xff0c;主要用于文章阅读数访问量的统计&#xff0c;插件使用简单&#xff0c;直接安装启用即可&#xff0c;并…

ionic拍照,从相册选择功能

在介绍插件的使用之前&#xff0c;我们有必要先大致了解下插件的原理 一、插件工作原理分析 一个插件是如何正确地在IONIC框架下运行的呢? 前台的HTML/js代码又是如何与后面具体平台做数据交互的呢? 这个就需要对插件的工作原理及各个模块之间的流程关系有一个基本的了解。 为…

python爬虫爬图片教程_python爬虫实战之爬取京东商城实例教程

前言 本文主要介绍的是利用python爬取京东商城的方法&#xff0c;文中介绍的非常详细&#xff0c;下面话不多说了&#xff0c;来看看详细的介绍吧。 主要工具 scrapy BeautifulSoup requests 分析步骤 1、打开京东首页&#xff0c;输入裤子将会看到页面跳转到了这里&#xff0c…

安卓camera总体框架

今天是周五了&#xff0c;时间过得真快&#xff0c;通常这个时候&#xff0c;我都还沉醉了上班的状态中&#xff0c;说到上班&#xff0c;我是认真的&#xff0c;我非常喜欢上班&#xff0c;特别是今天&#xff0c;我会听到一声优美的声音&#xff0c;我的银行卡会多出一些钱&a…

matlab可以连接阻抗分析仪么,阻抗分析仪的工作原理与测试方法

阻抗分析仪和LCR表是非常通用的测量器件的电子仪器。根据阻抗范围和频率范围的不同&#xff0c;有一系列不同原理的仪器来满足测试要求&#xff0c;图1是不同阻抗范围和不同频率范围的阻抗测量方法。图1 阻抗测量方法图2是自动平衡电桥法的原理框图。通过精确测量加载到被测件D…

项目管理中的沟通管理(转)

集成项目管理中的沟通管理 摘要&#xff1a;本文从沟通关系、方式及容易出现的问题阐述如何进行项目的沟通管理&#xff0c;并通过示例展现一个普通的集成类项目中的沟通方法。 关键词&#xff1a;沟通管理 系统集成 项目管理就是指把各种系统、方法和人员结合在一起&#xff0…

分享几个有意思的视频

最近微信加我的好友有点多&#xff0c;然后问问题的也不少&#xff0c;有的问题我不知道&#xff0c;有的问题我觉得百度一下应该很多答案&#xff0c;有的问题我觉得我可以知道&#xff0c;但是需要自己去寻找答案&#xff0c;也需要花费我一些时间&#xff0c;我有时候非常不…

python判断对象是否实例化_Python判断对象是否相等及eq函数的讲解

摘要 什么是python对象的标识 python对象相等的判断 自定义python对象相等的条件 python对象的标识 python对象标识就是python对象自身的要素&#xff0c;python对象主要有3要素&#xff1a; id:相当于对象在内存中的地址&#xff0c;相当于c的指针&#xff0c;可以用id(对象)来…

php+redis+设置前缀,spring使用Redis自定义前缀后缀名(去掉SimpleKey []+自定义)

标签&#xff1a;spring中自动加上 SimpleKey [] 解决方案一、自定义后缀名1、定义类实现KeyGenerator接口MyKeyGeneratorpackage com.wbg.springRedis.service.impl;import org.springframework.cache.interceptor.KeyGenerator;import org.springframework.stereotype.Compon…

gravity 时序图绘制,改

gmt gmtset FONT_TITLE 24,37gmt gmtset MAP_GRID_PEN_PRIMARY 0.5p,bluegmt gmtset FORMAT_DATE_IN yyyy-mm-dd FORMAT_DATE_MAP yyyy-mm set R-R2008-01-01\T/2017-05-31\T/-100/80set J-JX9i/6irem x轴格网间隔密度为3个月&#xff1f;gmt psbasemap %R% %J% -Bxa12O -Bya2…

php wdatepicker,WdatePicker时间控件的使用

1&#xff0c;引入js文件2&#xff0c;js代码function createTime(){WdatePicker({dateFmt:yyyy-MM-dd,minDate:2010-10-01,maxDate:2012-10-01});}3&#xff0c;html代码4&#xff0c;介绍这是最基本的使用方法&#xff0c;如需要增加或减少内容&#xff0c;可通过改变WdatePi…

python列表如何修改_如何在python中更改列表的字典中的值

for x in range(0, 5): ohlc_list[x] [open , high , low, close] 这并没有按照您的想法做.它为相同的4个列表创建5个引用,并将这些引用保留在不同的键下. 这可以用以下循环显示&#xff1a; for value in ohlc_list.values(): print([id(inner_list) for inner_list in value…

北京的林书豪,像一把小李飞刀

从《我要打篮球》节目开始&#xff0c;就一直在关注书豪的比赛&#xff0c;我喜欢书豪&#xff0c;书豪选择来CBA打球&#xff0c;也满足了很多球迷的愿望&#xff0c;近距离感受球星的那种状态&#xff0c;今天晚上&#xff0c;北京跟青岛的比赛&#xff0c;我是一分钟没有拉下…

20170706xlVBA城中村改造汇总

Public Sub GatherDataPicker()Application.ScreenUpdating FalseApplication.DisplayAlerts FalseApplication.Calculation xlCalculationManualApplication.StatusBar ">>>>>>>>程序正在运行>>>>>>>>"On Erro…

php 循环队列,队列和循环队列-php数组

//实现基本队列class Queues{private $head;private $tail;private $cnt; //数组大小private $array [];public function __construct($n 5){$this->cnt $n;$this->head 0;$this->tail 0;}//数组实现队列public function basisEnQueue($val){//队列已满if ($this…

I2C和SPI注定要打一架

最近微信群里好几天聊到I2C&#xff0c;既然说到了I2C&#xff0c;那就有必要说SPI&#xff0c;那就一起说了算了&#xff0c;大家有更好见解的&#xff0c;留言回复下&#xff0c;让更多的人知道你的观点。整理与网络&#xff0c;侵删I2C和SPI应该要打一架&#xff1f;现今&am…

python opencv创建图像_OpenCV-Python 展示图像(1)

可以用 cv.imshow(winName, imgMat) 函数在窗口中显示图像。窗口大小会随着图像大小自动调整。 第一个参数是字符串类型&#xff0c;表示窗口名称&#xff0c;可以用不同的窗口名称来创建多个窗口。 第二个参数是要显示的图像数据。 cv.imshow(tmp_window, img) cv.waitKey(0) …