c-为什么如果循环从1开始,它会返回垃圾值,但当循环从0开始时,它会打印有效的答案


#include <stdio.h>
int sumofelements(int a[],int size)
{
int i,sum=0;
for (i=1;i<=size;i++)  
{
sum+=a[i];
}
return sum;
}
int main()
{
int a[]={1,2,3,4,5};
int size=sizeof(a)/sizeof(a[0]);
int soe=sumofelements(a,size);
printf("sum of the elements=%dn",soe);
}

sumofelements中的错误,其中for循环如果以1开始,则会产生垃圾值。

此循环:

for (i=1;i<=size;i++)  
{
sum+=a[i];
}

使用[1]、a[2]、a[3]、a[4]和[5]

此循环:

for (i=0;i<size;i++)  
{
sum+=a[i];
}

使用[0]、a[1]、a[2]、a[3]和[4]

没有[5]。你忘了一个[0]。所以第二个循环给了你正确的答案,而第一个循环没有。

因为使用for循环条件i <= size,在循环的最后一次迭代时,您将读取超出a指向的数组的边界,这就是程序具有未定义行为的原因。

如果您使用i < size,这将是正确的,尽管将i设置为1意义不大,因为索引计数从0开始,并且您将省略一个数组元素,如果您将每个元素的所有值计算在一起,这是非常重要的。

我认为你的整个困惑是因为你可能认为第一个元素是a[1],但事实并非如此——它是a[0]

因此,正确定义sumofelements()的唯一解决方案是:

int sumofelements(int a[],int size)
{
int i,sum=0;
for (i=0;i<size;i++)  
{
sum+=a[i];
}
return sum;
}

最新更新