请教一个控制台c++简单程序,出现的错误及原因说明

本人基本掌握c语言,初学c++,有问题一c++程序请教:以下源代码是定义一个类,并用该类寻找规定范围(上限)中的素数,并打印出结果..可是一运行,就报错..当跟踪其运行时... 本人基本掌握c语言,初学c++,有问题一c++程序请教:
以下源代码是 定义一个类,并用该类寻找规定范围(上限)中的素数,并打印出结果..
可是一运行,就报错..当跟踪其运行时,发现连cout << i; 都不行..
即使加个stdio.h换成printf("%d",i);也是一样会出错,程序就停在那行.
这是老师布置的题目,我的代码,因为初学,不知道怎么错,而且,编译时没有报错..特此请教..
重点是希望能知道错在哪里,以及原因简单说明.
如果有更好的解决思路,亦可提出(main函数是给定的,不可改变),但是不要忘记帮我找错.
本人使用并将长期使用vc6.0学习.

#include<iostream>
using namespace std;

class CSieve
{
private:
int n; //范围
int *p; //分配与n大小相等的地址,其连续地址中的值1为素数
public:
CSieve(int nn)
{
n=nn+1;
p=NULL;
}

void FindPrime() //找素数
{
if (!p)
{
int i,j;
p=(int *)new int(n);
for (i=2; i < n; i++)
p[i] = 1;
for (i=2; i < n; i++)
{
if (p[i] == 1)
{
for (j=i*i; j <= n; j += i)
p[j] = 0;
}
}
}
}

void PrintPrime() //打印素数
{
int i,col=0;
if (p)
{
for (i=2;i<n;i++)
{
if (p[i]==1)
{
cout << i;
col++;
}
if (!(col%=8))
cout<<endl;
}
}
}

~CSieve(){free(p);} //释放空间

};

int main()
{
CSieve number(1000);
number.FindPrime();
number.PrintPrime();
return 0;
}
展开
 我来答
kgddqypm_wkl
2007-10-20 · TA获得超过167个赞
知道小有建树答主
回答量:181
采纳率:0%
帮助的人:172万
展开全部
由于注释在复制时总乱码我就删了
你主要问题是内存分配
分配数组空间应该是p=new int[];中扩号;
小扩号是分配一个并赋值
释放用delete [] p;
malloc才是与free配套的,但不调用构造函数

调试后结果如下:
#include<iostream>
using namespace std;

class CSieve
{
private:
int n; //
int *p; //
public:
CSieve(int nn)
{
n=nn; //这里不+1,分配时再+1
p=NULL;
}

void FindPrime() //
{
if (!p)
{
int i=0,j=0;
p=new int[n+1];
for (i=2; i < n; i++)
p[i] = 1;

for (i=2; i < n; i++)
{
if (p[i] == 1)
{
for (j=i*i; j <= n; j += i)
p[j] = 0;
}
}
}
}

void PrintPrime() //
{
int i,col=0;
if (p)
{
for (i=2;i<n;i++)
{
if (p[i]==1)
{
cout << i<<endl;
col++;
}
if (!(col%=8))
cout<<endl;
}
}
}

~CSieve()
{
delete [] p;
}//

};

int main()
{
CSieve number(1000);
number.FindPrime();
number.PrintPrime();
return 0;
}
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式