我编写了以下代码来读取数组中的一些int值并找到它们中的最大值。
#include<stdio.h>
int main() {
int a[5] ;
int i ;
int Gr = 0 ;
int j ;
for ( i = 0 ; i <= 5 ; i++ ) {
scanf( "%d" , &a[i] ) ;
}
for ( j = 0 ; j <= 5 ; j++ ) {
if ( a[j] > Gr) {
Gr = a[j] ;
}
}
printf("%d\n" , Gr ) ;
return 0 ;
}
我观察到,如果对于数字1 and 2
,无论我输入多少次都不会停止循环并打印出最高的数字。
为什么会这样?
答案 0 :(得分:4)
此:
for ( i = 0 ; i <= 5 ; i++ )
错误,它将读取6个数字并溢出a
,触发未定义的行为(甚至可能覆盖i
)。它应该是:
for ( i = 0 ; i < 5 ; i++ )
在对数组中的for(i = 0; i < N; ++i)
项进行简单迭代时,您几乎总是应该使用模式N
。
对于这个特定的代码,重复5
并不是一个好主意,这是一个神奇的常数。使用sizeof
在编译时计算它:
for( i = 0; i < sizeof a / sizeof *a; ++i)
答案 1 :(得分:0)
for ( i = 0 ; i <= 5 ; i++ )
应该是
for ( i = 0 ; i < 5 ; i++ )