注:此代码非常依赖编译器,环境不一样,效果也可能不一样,虽然效果可能不同,但底层原理不变,思路才是重中之重!这里本人使用的是vs2019编译器。
这里有这样一段代码:
int main()
{
int i = 0;
int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
for (i = 0; i <= 12; i++)
{
arr[i] = 0;
printf("666\n");
}
return 0;
}
此时代码运行的结果是什么呢?
通过执行代码我们发现,程序会死循环的打印666。

但是为什么程序不是报错,而是死循环呢?接下来我们通过调试来观察代码执行的过程来分析死循环的原因。
开始调试,打开监视窗口,监视i和arr值的变化。


我们发现当i<=9时,代码运行一切正常,屏幕上打印出10组666,但当我们继续调试,当i=10的时候就会发生越界。
越界之后会发生什么现象?我们继续添加arr[10]和arr[11]来监视。


此时我们会发现arr[10]和arr[11]依然被修改了,而且printf函数也执行了,屏幕上此时打印出12组666。
那我们继续添加arr[12]来监视,代码继续调试,会发生什么?

这时候,arr[12]被修改了,但与此同时,i也被修改为0。
我们已经找到了死循环的原因,那就是改变arr[12]为0的同时,i也会被改变为0,导致i永远永远不会超过12,代码死循环。
到这里也许大家都会有一个疑问,那就是为什么i会被同时改变呢?我们不妨大胆猜测,是不是因为i和arr[12]的地址相同导致的?
我们在监视窗口添加&i和&arr[12]就会发现他们两个的地址确实相同!

再次说明:不是所有编译器的结果都是如此。
大家可能会有疑问,“为什么arr[12]和i的地址会一样?”
我来为大家浅浅的讲解一下计算机的内存分配和局部变量的存储大家就会明白了。
计算机的内存会划分为三个区域,分别为:栈区、堆区、静态区。
其中栈区是用来存放局部变量和函数形参的。
由于i和arr都是局部变量,所以会被存储在栈区中。
栈区的使用习惯是:先使用高地址处的空间,再使用低地址处的空间。
数组随下标的增长,地址是由低到高变化的。
下面我画个图来帮大家理解。

从图中不难看出,这里i和arr相差两个整型空间,所以,当我们越界访问arr的时候,arr[12]正好和i的地址一样,所以此时修改arr[12]也会同时修改i,这也就是为什么代码会死循环。
此代码是先创建i再创建arr,又因为i和arr都是局部变量,所以会被存储到栈区中。
栈区的使用习惯是:先使用高地址的空间,再使用低地址的空间,而且数组随着下标的增长,地址的变化是由低到高的,所以i存储的地址就会比arr的地址”高“。
如果在内存分配时,i和arr中间恰好空两个整型空间(编译器不同,结果不同,vc6.0编译器中,i和arr中间没有空间,而gcc编译器中,i和arr中间空一个整型空间),那么在循环的过程中,当数组向后越界访问时,就有可能出现改变arr[12]时,同时改变i这种现象,从而导致程序死循环。
我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0
我脑子里浮现出一些关于一种新编程语言的想法,所以我想我会尝试实现它。一位friend建议我尝试使用Treetop(Rubygem)来创建一个解析器。Treetop的文档很少,我以前从未做过这种事情。我的解析器表现得好像有一个无限循环,但没有堆栈跟踪;事实证明很难追踪到。有人可以指出入门级解析/AST指南的方向吗?我真的需要一些列出规则、常见用法等的东西来使用像Treetop这样的工具。我的语法分析器在GitHub上,以防有人希望帮助我改进它。class{initialize=lambda(name){receiver.name=name}greet=lambda{IO.puts("He
我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代
我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
我想用ruby编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序
我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此
我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r