c语言小小小小小小小小小小小小问题

来源:百度知道 编辑:UC知道 时间:2024/05/08 14:30:31
定义一个含有30个整形元素的数组,按顺序分别赋予从2开始的偶数,然后按顺序每五个数求出一个平均值,放在另一个数组中并输出,请编程。
我只想搞清楚下面这程序为什么有错,并不想要其它答案。

#include <stdio.h>
main()
{
int a[30],b[6],i,j=2,x=0,sum=0;
for(i=1;i<=30;i++,j+=2)
{
a[i]=j;
printf("%5d",a[i]);
sum+=a[i];

if(i%10==5||i%10==0)
{
b[x]=sum/5;
printf(" sum=%d",sum); /*第x行*/
printf(" ping jun shu:%d",b[x]);
printf("\n");
sum=0;
x++;
}
}
}
运行结果:
2 4 6 8 10 sum=30 ping jun shu:6
12 14 16 18 20 sum=80 ping jun shu:16
22 24 26 28 30 sum=130 ping jun shu:26
32 34 36 38 40 sum=180 ping jun shu:36
42 44 46 48 50 sum=230 ping jun shu:46
52 54 56 58 60 sum=280

int a[30]
对它的可以操作的数据是a[0]...a[29]
最简单的修改是
int a[31]

你出错的原因是,int a[30];
a的范围是a[0] 到 a[0]+30*4 -1 的内存地址。
共120字节。每个int 4字节。
a[30]的内存地址是 a[0]+30*4 到 a[0]+30*4+3 的地址。
应该是 b[]的第一个int.
因为没有对b赋初值,所以可能是任何值。结果也会变来变去。

C语言是限制很松的语言。甚至 a[-1]编译时都不会报错误。
一定要小心。

看了很久,也觉得奇怪,建议你断点调试一下吧

程序有问题.

int a[30]; //数组长度是30

for(i=1;i<=30;i++,j+=2)
{
a[i]=j; //赋值越界,应该从a[0]开始.
...
}