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.
但是我改了之后还是报错 展开
以下是我的代码:
#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.
但是我改了之后还是报错 展开
展开全部
for (i=0;i<=999;i++)
这句循环,也就是说i始终会变成999 ,p为数组a的头指针,也就a[0],p+999可以看做,0+999。也就是要访问a[999]这个数组元素,但是你懂得,数组角标是从0起的,到998已经有999个元素了。越界了。
这句循环,也就是说i始终会变成999 ,p为数组a的头指针,也就a[0],p+999可以看做,0+999。也就是要访问a[999]这个数组元素,但是你懂得,数组角标是从0起的,到998已经有999个元素了。越界了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
最后的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;
}
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;
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
开数组的话开到a[1000].
因为你否面for循环条件是i<=999
而数组长度是999,在下标却是998!
系统会自动向后找*(p+i) !=0是否成立。
明显会数组越界!!!!!
因为你否面for循环条件是i<=999
而数组长度是999,在下标却是998!
系统会自动向后找*(p+i) !=0是否成立。
明显会数组越界!!!!!
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
for (i=0;i<=999;i++)
if(*(p+i) !=0) cout<<*(p+i)<<" ";
nt a[999],*p=a,
这样还不越界么。
数组只能到 a[998],
*(p+i) 最大到 *(p+999)
if(*(p+i) !=0) cout<<*(p+i)<<" ";
nt a[999],*p=a,
这样还不越界么。
数组只能到 a[998],
*(p+i) 最大到 *(p+999)
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询