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



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

这是头文件。

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文件。主要的问题是加(const多项式&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,例如,对于多项式"3*x^5+2*x^3-x^2+7",其阶数为5,系数数组为{7.0,0.0,-1.0,2.0,0.0,3.0}

崩溃是而不是在您指示的行中。

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

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未初始化,因为来自上述for循环的j是不相关的变量,与外部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++;
}

当然,代码真正的大问题是不使用std::vector

最新更新