有人可以解释一下,为什么编译这段代码有不同的行为。例如,gcc
具有无限循环,但clang
按预期工作。
是的,我知道代码不仅仅是丑陋,几年前由我写的,只是想知道为什么切换机器会对这么简单的代码产生这样的影响,至少我没有使用堆栈,堆,指针什么都没有。
#include <stdio.h>
main()
{
int a,b,state,nl,i,temp1,temp2;
int words[10];
nl = temp1 = 0;
for( i = 0 ; i < 10 ; i++ )
words[i] = 0;
while((a = getchar()) != EOF)
{
nl++;
if( a == ' ' || a == '\t' || a == '\n' )
{
words[nl-2]++;
nl = 0;
}
}
for(b=0; b < 10; b++)
printf("%d",words[b]);
printf("\n");
for( b = 1 ; b <= 10 ; b++)
printf("%d",b);
printf("\n");
for( b = 0 ; b <= 10 ; b++)
if(words[b]>temp1)
temp1=words[b];
//printf("%d\n", temp1);
for(; temp1 > 0 ; temp1--)
{
for(i= 0 ; i <= 10 ; ++i)
{
if(words[i]>0)
{
// temp2 = i;
// for(; temp2 > 0; temp2--)
// printf(" ");
printf("#");
words[i]--;
}
else
printf(" ");
}
printf("\n");
}
}
答案 0 :(得分:4)
至少:
words[nl-2]++;
导致未定义的行为时,可以调用nl == 1
。temp1=words[b];
时,可以调用b == 10
。if(words[b]>temp1)
将在b == 10
时调用,if(words[i]>0)
正在访问数组越界。i == 10
将在words[i]--;
时调用,i == 10
正在访问数组越界。通常,在给定未定义的行为时,不同的编译器会有所不同。