首页 新闻 会员 周边

这段程序为什么要用static定义数组,当定义为普通数组的时候就会出现死循环。求高人读程序,解析原因

0
悬赏园豆:20 [已解决问题] 解决于 2013-10-13 17:49

题目:一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程
找出1000 以内的所有完数。
1. 程序分析:请参照程序<--上页程序14.
2.程序源代码:
main()
{
static int k[10];
int i,j,n,s;
for(j=2;j<1000;j++)
{
n=-1;
s=j;
for(i=1;i<J;I++)
{
if((j%i)==0)
{ n++;
s=s-i;
k[n]=i;
}
}
if(s==0)
{
printf("%d is a wanshu",j);
for(i=0;i<N;I++)
printf("%d,",k[i]);
printf("%d\n",k[n]);
}
}
}

1828080947的主页 1828080947 | 初学一级 | 园豆:177
提问于:2013-10-08 22:13
< >
分享
最佳答案
1

试了一下你的程序,你写得有问题,完成你的运算数组k的长度10是不够的,最小长度需要31,因此运算过程中会访问越界而出现异常结果,把k的长度改成31以上就无论是否是static变量都正常了。

之所以会出现static和非staic变量的结果不一样,那是因为static变量存储在全局变量区,而非static时存储在栈中,不同的编译器的也处理方式不大一样,越界访问后呈现的结果也不大一样,但大多没有多少保护机制,因此有的时候仍然能正常运行出结果的。而异常结果就没有什么好考究的了,像我拿vc来运行的时候就都能看到结果,只是退出的时候报越界访问。

收获园豆:20
天方 | 大侠五级 |园豆:5407 | 2013-10-08 23:51
其他回答(2)
0

楼上说得好,错误是k[n]=i;这句,数组越界的问题。

幻天芒 | 园豆:37175 (高人七级) | 2013-10-09 02:15
0

酱紫啊~我是来看答案的....

W宁宁 | 园豆:522 (小虾三级) | 2013-10-09 11:26
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册