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