谁共我疯狂?

Mein Leben ist sehr schlimm!

用户操作
[即时聊天] [发私信] [加为好友]
Aoouch.NETID:Aoouch
143587次访问,排名557好友0人,关注者1
Aoouch的文章
原创 101 篇
翻译 1 篇
转载 34 篇
评论 92 篇
最近评论
czdvcc:wow power leveling
zoorz:能把这个战斗机模型的来源 哪里搞的告诉我吗

我的信箱 zoorz@163.com

真的是全金属的吗 能把细节拍的好的片发个给我吗

谢谢

yinghelv:感觉微软的一些东西还是不错的
ammana_babi:呵呵,楼主这个程序是典型的数组越界问题,在数组越界的时候,什么样的问题都是会发生的。
这个程序在 VC 6.0 下,会出现楼主所说的死循环。
在VC 2003 下,会提示你数组访问越界。
在 Dev C++ 下,则不会有任何问题,编译和运行均通过。

只是要说的是,这样的代码让自己全当练习,长个记性还行。
千万不要出现在工程中,运行……
marstone:技术人员的工作就是对用户屏蔽那些复杂的技术,提供方便,漂亮的UI,换句话说,技术人员就是尽量让用户感觉不到技术人员的存在。悲哀?理解万岁吧,呵呵
文章分类
    收藏
      相册
      Internet
      Korea
      Look
      Tech
      Temp
      Temp2
      存档
      软件项目交易
      订阅我的博客
      XML聚合  FeedSky
      订阅到鲜果
      订阅到Google
      订阅到抓虾
      订阅到BlogLines
      订阅到Yahoo
      订阅到GouGou
      订阅到飞鸽
      订阅到Rojo
      订阅到newsgator
      订阅到netvibes

      转载 让汇编揭开死循环的神秘面纱收藏

      新一篇: 岁月如歌 -- 黄家驹 | 旧一篇: 什么是数据仓库

      有的时候,也许我们会面对一些令自己无法解释的问题。在语言本身无法告诉我们原因的时候,从汇编的层面看问题,可能就会有“柳暗花明又一村”之效。

      首先请大家看这么一个简单的小程序:

      #include <stdio.h>

      void main()
      {
          int i, b[10];
          for ( i = 0; i <= 10; i++ )
          {
              b[i] = 0;
          }
      }

      请问这个程序是否有错?A.正常 B.越界 C.死循环

      正确答案是C,相信选A或选B的朋友一定会很纳闷。事实上我也是如此,单单从程序的表面上看,按定义这应该是个越界,因为当循环进行到i == 10的时候,程序将试图将b[10]赋值为0,而C语言中,b[10]的声明就是指定b[0]~b[9]可用。

      然而程序的结果你看到了,这是个死循环无疑。

      也好,那么让汇编来告诉你——以及我——这一切的真相吧,在这之前请你把i和b[10]的定义改成:

      int i = 0, b[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

      然后,将这个程序反汇编,可以得到:

      让我来解释一下这段汇编代码的含义吧。在系统的实现中,i和数组b[10]是分配在栈上的变量,在内存中的分布如下图:

      现在你看到了,i所占据的正是b[10]的位置,而b[10] = 0;这一句会被这样运行:

      *(&b[0] + 10) = 0;

      所以这一句的结果,就是把0赋值给i。这样一来在第11次循环的时候,i将会被重新置为0,那么循环结束的条件也就永远不会满足了,循环也就是个死循环了。

      事实上单单讨论C语言的内部实现并没有什么意义,而且这样书写的循环在程序设计中也绝对不能够出现。所以我所想要讨论的,就是如何让汇编帮助我们解决表面上无法看清楚的东西,仅此而已。

      发表于 @ 2006年04月22日 17:28:00|评论(loading...)|编辑

      新一篇: 岁月如歌 -- 黄家驹 | 旧一篇: 什么是数据仓库

      评论

      #YippeeSoft开心软件-盛放漫敲 发表于2006-04-22 23:16:00  IP: 59.61.147.*
      TrackBack来自《0428 VC 汇编 死循环 1》

      0428 汇编 死循环 1看到一个人转的文字,好像很确定的样子,下面有几个人试验了好像不行,试一试#include <stdio.h>void main()&leftsign;    int i, b[10];    for (..
      #YippeeSoft开心软件-盛放漫敲 发表于2006-04-22 23:20:00  IP: 59.61.147.*
      TrackBack来自《0429 VC 汇编 死循环 2》

      0429 汇编 死循环 2看到一个人转的文字,好像很确定的样子,下面有几个人试验了好像不行,试一试原来区别在于控制台和MFC对话框程序刚才是void CTestDlg::OnOK() &leftsign; int i=0,b[10] = &..
      #ovo 发表于2006-04-22 18:21:00  IP: 221.215.88.*
      #include <stdio.h>
      void main()
      {
      int i = 0, b[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
      for ( i = 0; i <= 10; i++ )
      {
      b[i] = 0;
      }
      printf("%d\n",i);
      }

      为什么结果还是显示11??
      #莫取网名 发表于2006-04-22 22:15:00  IP: 218.64.109.*
      楼主,怎么你贴出的这个程序,我在我机子上可以正常运行啊?
      没有死循环的迹象啊。
      #ammana_babi 发表于2007-05-21 17:15:19  IP: 10.99.28.87, 61.*
      呵呵,楼主这个程序是典型的数组越界问题,在数组越界的时候,什么样的问题都是会发生的。
      这个程序在 VC 6.0 下,会出现楼主所说的死循环。
      在VC 2003 下,会提示你数组访问越界。
      在 Dev C++ 下,则不会有任何问题,编译和运行均通过。

      只是要说的是,这样的代码让自己全当练习,长个记性还行。
      千万不要出现在工程中,运行直接当机或者提示错误还好,
      最多是一颗炮弹,肯定是要炸到你身边。如果是编译和运行
      都没有什么问题,那么你就惨了,因为这是一颗定时炸弹,
      那么这对于整个工程来说是致命的,谁都不知道啥时候
      它就被引爆了,整的大家是恍恍不可终日。
      发表评论  


      当前用户设置只有注册用户才能发表评论。如果你没有登录,请点击登录
      Csdn Blog version 3.1a
      Copyright © Aoouch.NET