下面这段程序在release运行时将会出错,原因何在?int yin[20];
void test()
{
    int k=0;
    int i;    yin[0] = 0;
    for( i=1; i<6; i++) 
    {
        yin[i]=yin[k];
        k=i;
        if( (i%2) == 0 )
        {
            i++;
        }
    }
}

解决方案 »

  1.   

    //你可以用VC6.0创建一个 Win32 Console Application 工程 然后复制如下代码到你新建的工程里,用Release编译执行,结果将出错,你会发现,虽然变量i已经大于等于2了,但是break语句却没有被执行。怪哉?
    #include "stdafx.h"int yin[20];
    main()
    {
      int k=0;
      int i=1;
      
      yin[0] = 0;
      while(1)
      {
       yin[i]=yin[k];
       k=i;
       if( (i%2) == 0 ){
        i++;
       }
       i++;
       printf("%d, ",i);
       if(i>=2){
        printf("success\n");
        break;
       }
      }  return 0;
    }
      

  2.   

    我在vc++6.0(e版,2000server)下运行没有错啊~~
    int yin[20];
    void test()
    {
        int k=0;
        int i;    yin[0] = 0;
        for( i=1; i<6; i++) 
        {
            yin[i]=yin[k];
            k=i;
            if( (i%2) == 0 )
            {
                i++;
            }
        }
    }
    void main()
    {test();}
      

  3.   

    debug模式下是正常的,但是在Release模式下会出错,我的系统是VC6.0英文版,win2000 professional我在UNIX环境下运行一切正常
      

  4.   

    real bug.
    this is ok.
    #include <stdio.h>
    #include <stdlib.h>
    //int yin[20];
    main()
    {
     int yin[20];
     int k=0;
      int i=1;
      
      yin[0] = 0;
      while(1)
      {
       yin[i]=yin[k];
       k=i;
       if( (i%2) == 0 ){
        i++;
       }
       i++;
       printf("%d, ",i);
       if(i>=2){
        printf("success\n");
        break;
       }
      }  return 0;
    }
      

  5.   

    http://expert.csdn.net/Expert/topic/1456/1456991.xml?temp=.1895563
      

  6.   

    我用的是XuLijian(部落) 的代码,发现是VC编译器优化的问题
    用汇编发现了问题:
    在while(1)处
    经优化的代码会有
    mov ebp, 4指令在if(i>=2){
    经优化的代码会用ebx和8比较, 如
    cmp ebx, 8
    jl....在此期间ebx无变化,会死循环,不会如想像的那样break;所以会造成内存越限。在工程设置时将编译设为不优化方式就好了,系统缺省是优化方式