创建动态数组似乎会导致程序终止

时间:2015-11-21 11:29:19

标签: c++

我正在研究关于多项式的任务。其中一项任务是计算两个多项式的和,并将结果返回到新的多项式中。但是当我运行程序时,程序终止了。当我试图测试哪个部分是错误的时,似乎创建动态数组的行是错误的。我不明白为什么,请帮忙。

这是头文件。

class polynomial
{
 private:
  double* coefficient;
  int degree;

 public:
 // CONSTRUCTOR member functions
  polynomial(void);
  polynomial(int degree, const double* coeff);
  polynomial(const polynomial& p);

 //DESTRUCTOR member function
  ~polynomial(void);

 //ACCESSOR member functions
  void print(void) const;
  polynomial add(const polynomial& p) const;
  double evaluate(double x) const;

 //MUTATOR member functions
  void scale(int scale);
};

这是关于构造函数的cpp文件。

polynomial::polynomial(void)
{
 degree = 0;
 coefficient = new double [degree+1];
 coefficient[0] = 0;
}

polynomial::polynomial(const polynomial& p)
{
 coefficient = new double [p.degree+1];
 for (int i = 0; i < p.degree+1; i++)
 coefficient[i] = p.coefficient[i];
 degree = p.degree;
}

polynomial::polynomial(int degree, const double* coeff)
{
 coefficient = new double [degree+1];
 for (int i = 0; i < degree+1; i++)
     coefficient[i] = coeff[i];
 polynomial::degree = degree;
}

这是cpp文件。主要问题是add(const polynomial&amp; p)const部分。其他人只是为了更好地理解该计划。

polynomial polynomial::add(const polynomial& p) const
{
int degree_diff;
if (degree >= p.degree)
{
    int i;
    degree_diff = degree - p.degree;

    polynomial result;      // The program terminates here.
    result.coefficient = new double[degree+1];
    for (i = 0; i < p.degree+1; i++)    
        result.coefficient[i] = coefficient[i] + p.coefficient[i];

    while (degree_diff != 0)    
    {
        result.coefficient[i] = coefficient[i];
        degree_diff--;
        i++;
    }

    result.degree = degree;
    return result;
}
else    // The case when (degree < p.degree)
{
    int j;
    degree_diff = p.degree - degree;
    polynomial result;
    result.coefficient = new double[p.degree+1];
    for (int j = 0; j < degree+1; j++)
        result.coefficient[j] = coefficient[j] + p.coefficient[j];

    while (degree_diff != 0)
    {
        result.coefficient[j] = p.coefficient[j];
        degree_diff--;
        j++;
    }

    result.degree = p.degree;
    return result;
    }
}

我无法找出程序崩溃的原因。请帮忙。 Fyi,Eg,对于多项式“3 * x ^ 5 + 2 * x ^ 3 -x ^ 2 + 7”,其度数为5,系数数组为{7.0,0.0,-1.0,2.0,0.0,3.0} < / p>

1 个答案:

答案 0 :(得分:0)

您所指示的行中的不是

当您通过具有足够高警告级别的编译器运行此代码时,您可能会看到如下消息:

i_am = Silly()
i_am.silly = 'No, I'm clever'
print i_am.silly

它将指向以下行:

warning C4700: uninitialized local variable 'j' used

int j; degree_diff = p.degree - degree; polynomial result; result.coefficient = new double[p.degree+1]; for (int j = 0; j < degree+1; j++) result.coefficient[j] = coefficient[j] + p.coefficient[j]; while (degree_diff != 0) { result.coefficient[j] = p.coefficient[j]; // <----- WARNING degree_diff--; j++; } 未初始化,因为上面j循环中的j是一个不相关的变量,与外部for无关。外j未被初始化。当您尝试使用它作为数组索引读取变量时,这会导致未定义的行为。崩溃只是未定义行为的一种可能结果; 任何都可以发生。

所以你应该初始化j

j

或者您在两个循环中使用相同的int j = 0; // <----- INITIALISED degree_diff = p.degree - degree; polynomial result; result.coefficient = new double[p.degree+1]; for (int j = 0; j < degree+1; j++) result.coefficient[j] = coefficient[j] + p.coefficient[j]; while (degree_diff != 0) { result.coefficient[j] = p.coefficient[j]; degree_diff--; j++; }

j

当然,您的代码真正的大问题是您不使用int j = 0; // still a good idea degree_diff = p.degree - degree; polynomial result; result.coefficient = new double[p.degree+1]; for (j = 0; j < degree+1; j++) // <----- same j result.coefficient[j] = coefficient[j] + p.coefficient[j]; while (degree_diff != 0) { result.coefficient[j] = p.coefficient[j]; degree_diff--; j++; }