0428 汇编 死循环 1

看到一个人转的文字,好像很确定的样子,下面有几个人试验了好像不行,试一试

#include <stdio.h>

void main()
&leftsign;
    int i, b[10];
    for ( i = 0; i <= 10; i++ )
    &leftsign;
        b[i] = 0;
    &rightsign;
&rightsign;

现在你看到了,i所占据的正是b[10]的位置,而b[10] = 0;这一句会被这样运行:
*(&b[0] + 10) = 0;
所以这一句的结果,就是把0赋值给i。这样一来在第11次循环的时候,i将会被重新置为0,那么循环结束的条件也就永远不会满足了,循环也就是个死循环了。

我觉得有点奇怪,按照道理应该先分配I吧,看看汇编代码

185:      int i=0,b[10] = &leftsign; 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 &rightsign;;
0040237D   mov         dword ptr [ebp-8],0
00402384   mov         dword ptr [ebp-30h],1
0040238B   mov         dword ptr [ebp-2Ch],2
00402392   mov         dword ptr [ebp-28h],3
00402399   mov         dword ptr [ebp-24h],4
004023A0   mov         dword ptr [ebp-20h],5
004023A7   mov         dword ptr [ebp-1Ch],6
004023AE   mov         dword ptr [ebp-18h],7
004023B5   mov         dword ptr [ebp-14h],8
004023BC   mov         dword ptr [ebp-10h],9
004023C3   mov         dword ptr [ebp-0Ch],0Ah
186:  for ( i = 0; i <= 10; i++ )
004023CA   mov         dword ptr [ebp-8],0
004023D1   jmp         CTestDlg::OnOK+7Ch (004023dc)
004023D3   mov         eax,dword ptr [ebp-8]
004023D6   add         eax,1
004023D9   mov         dword ptr [ebp-8],eax
004023DC   cmp         dword ptr [ebp-8],0Ah
004023E0   jg          CTestDlg::OnOK+8Fh (004023ef)
187:  &leftsign;
188:  b[i] = 0;
004023E2   mov         ecx,dword ptr [ebp-8]
004023E5   mov         dword ptr [ebp+ecx*4-30h],0
189:  &rightsign;
004023ED   jmp         CTestDlg::OnOK+73h (004023d3)
190:  printf("%d\\n",i);
004023EF   mov         esi,esp
004023F1   mov         edx,dword ptr [ebp-8]
004023F4   push        edx
004023F5   push        offset string "%d\\n" (0041501c)
004023FA   call        dword ptr [MSVCRTD_NULL_THUNK_DATA (004176a0)]
00402400   add         esp,8
00402403   cmp         esi,esp
00402405   call        _chkesp (00401f8e)
191:
192:  &rightsign;

历史博文

标签:, , ,
九月 30, 2006 at 11:10 下午 by yippee 1,012 次
Category: Dev
Tags: , , ,