编码错误或编译器的错误

时间:2015-02-27 11:34:15

标签: c++ arrays oop segmentation-fault codeblocks

我正在为学校的项目编写这个代码,当我想尝试调试我的代码时,甚至在main()中运行第一行之前就出现了分段错误,所以我想知道我是否错过了我的代码或是编译器的错误。

#include <iostream>

using namespace std;

class poly
{
public: int a[1000000];
private:
int forx(int x);
public:
poly(){cout<<"add";}
~poly(){cout<<"kill";}
void add();
void sum(int *x,int *y);
void dif(int *x,int *y);
void mult(int *x,int *y);
void renew();
};
void poly::add()
{
int i,n;
cin>>n;
a[0]=n;
for (i=1; i<=n; i++)
{
    cin>>a[i];
}
}
int poly::forx(int x)
{
int s,i,p;
p=1;
for (i=1; i<=a[0]; i++)
{
    s+=p*a[i];
    p*=x;
}
return s;
}
void poly::sum(int *x,int *y)
{
int i,m=x[0]>y[0]?x[0]:y[0];
a[0]=m;
for (i=1; i<=a[0]; i++)
{
    a[i]=x[i]+y[i];
}
}
void poly::dif(int *x,int *y)
{
int i,m=x[0]>y[0]?x[0]:y[0];
a[0]=m;
for (i=1; i<=a[0]; i++)
{
    a[i]=x[i]-y[i];
}
for (i=a[0]; i>0; i--)
{
    if (a[i]!=0) break;
    a[0]--;
}
}
void poly::mult(int *x,int *y)
{
int i,j,k;
for (i=1; i<=(x[0]+y[0]-2); i++)
{
    j=0;
    k=y[0]-1;
    while (j+k!=i)
    {
        if (j+k>i) k--;
        if (j+k<i) j++;
    }
    while (j<x[0] && k>=0)
    {
        a[i]+=x[j]*y[k];
        k--;
        j++;
    }
}
}
void poly::renew () {
int i;
for (i=1; i<=a[0]; i++)
{
    cout<<a[i];
}
}

int main()
{
cout<<"starting";
poly w;
w.add();
poly h;
h.add();
poly o;
o.sum(w.a,h.a);
o.renew();
o.dif(w.a,h.a);
o.renew();
o.mult(w.a,h.a);
o.renew();
}

1 个答案:

答案 0 :(得分:2)

属于int a[1000000];poly类的大小非常大。制作一个(实际上你正在制作3)这个类的局部变量(在堆栈上)会给你分段错误。

您可以尝试制作它们static或将它们移动到全局范围或动态分配它们。

...
static poly w;
w.add();
static poly h;
h.add();
static poly o;
...

另一种解决方案是将array替换为std::vector

public: int a[1000000];更改为

...
public: std::vector<int> a;
...
poly() : a(1000000) {cout<<"add";}
...

现在您可以创建此类的本地对象。


另一个相关问题 Segmentation fault on large array sizes