C++编程失乐园

致力于解决论坛的不足,探讨C++的原理

C/C++随笔 之 一个有趣的C循环问题

void main()
{
 int i;
 int a[10];
 for(i = 0;i <=10;i ++)
  a[i] = 0;
}
大家看,很简单的一个问题,但是为什么会一直执行呢?
明显,聪明的你看出问题出现for(i = 0;i <= 10;i ++)   a[i] = 0;
总共定义了10个int,明显循环超出了范围,
下面我们就来看看其汇编如何运行,大家就都明白了.
00401031   mov         eax,dword ptr [ebp-4]
00401034   add         eax,1
00401037   mov         dword ptr [ebp-4],eax
0040103A   cmp         dword ptr [ebp-4],0Ah
0040103E   jg          main+3Dh (0040104d)
00401040   mov         ecx,dword ptr [ebp-4]
00401043   mov         dword ptr [ebp+ecx*4-2Ch],0
0040104B   jmp         main+21h (00401031)
程序一直在00401031-0040104B之间运行,问题出在00401043上面,
i变量在dwort ptr[ebp-4]
那么当执行到i =10
dword ptr[ebp + ecx*4-2cH]= dword ptr[ebp+dword ptr[ebp-4]*4-2ch]
=dword ptr[ebp + 10*4-44] = dword ptr[ebp-4]
哈哈,i变成了0

posted on 2006-12-25 12:41 木木头 阅读(229) 评论(2)  编辑 收藏 引用 所属分类: C++特性

评论

# re: 一个有趣的C循环问题 2006-12-25 13:04 pengkuny

不懂,是否一定要学汇编  回复  更多评论   

# re: 一个有趣的C循环问题 2006-12-25 13:20 Dain

这是数组是按照升序存放的,使得i的地址与a[10]的地址相同
输出它们的地址就知道怎么回事了  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理


导航

<2006年12月>
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456

统计

常用链接

留言簿(3)

随笔分类(29)

搜索

最新随笔

最新评论