C++指针的简单题目 20

题目要求用eratosthenes法来求1000以内的质数(也就是那个筛子法)。以下是我的代码:#include<iostream>usingnamespacestd;i... 题目要求用eratosthenes法来求1000以内的质数(也就是那个筛子法)。
以下是我的代码:
#include <iostream>using namespace std;int main (){int a[999],*p=a,k=1;for (int i=1;i<=1000;i++)*(p+i-1)=i;for (k=1;k<=499;k++){ int *q=p+k; if ((*q)!=0) { for (int j=2;((*q)*j-1)<=1000;j++) *(p+((*q)*j-1))=0; }

}for (i=0;i<=999;i++)if(*(p+i) !=0) cout<<*(p+i)<<" ";return 0;}

运行的结果如下
答案是算出来了,但是为什么会出现报错,是不是我哪个指针超出范围了?
是的,我搞错了,我忘了最后一个数的下标是长度-1.
但是我改了之后还是报错
展开
 我来答
百度网友0a5812e
2013-06-12 · 超过64用户采纳过TA的回答
知道小有建树答主
回答量:265
采纳率:0%
帮助的人:126万
展开全部
for (i=0;i<=999;i++)

这句循环,也就是说i始终会变成999 ,p为数组a的头指针,也就a[0],p+999可以看做,0+999。也就是要访问a[999]这个数组元素,但是你懂得,数组角标是从0起的,到998已经有999个元素了。越界了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
mo6830968
2013-06-12 · 超过18用户采纳过TA的回答
知道答主
回答量:45
采纳率:0%
帮助的人:40.5万
展开全部
最后的for循环里面,for(i=0;i<=999;i++)应该改成for(i=0;i<999;i++),因为你声明数组成999大小,从下标0开始,最大只有998,你遍历到1000才出循环,会访问p[999],所以报错。粗略看……
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2013-06-13
展开全部
#include <iostream>
using namespace std;
int main ()
{int a[999],*p=a,k=1;
for (int i=1;i<=1000;i++) //这里越界了 应该 是 i<1000
*(p+i-1)=i;
for (k=1;k<=499;k++)
{
int *q=p+k;
if ((*q)!=0)
{
for (int j=2;((*q)*j-1)<=1000;j++) //这里也越界了应该是 ;((*q)*j-1)<999
*(p+((*q)*j-1))=0;
}

}
for (i=0;i<=999;i++) //还有这里应该是 i<999
if(*(p+i) !=0) cout<<*(p+i)<<" ";
return 0;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
snowland
2013-06-12 · 知道合伙人软件行家
snowland
知道合伙人软件行家
采纳数:1229 获赞数:7313
多次参加C++算法类竞赛获奖。

向TA提问 私信TA
展开全部
开数组的话开到a[1000].
因为你否面for循环条件是i<=999
而数组长度是999,在下标却是998!
系统会自动向后找*(p+i) !=0是否成立。
明显会数组越界!!!!!
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
xx_lyq00
2013-06-12 · TA获得超过4139个赞
知道大有可为答主
回答量:1794
采纳率:88%
帮助的人:801万
展开全部
for (i=0;i<=999;i++)
if(*(p+i) !=0) cout<<*(p+i)<<" ";

nt a[999],*p=a,

这样还不越界么。

数组只能到 a[998],

*(p+i) 最大到 *(p+999)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式