0

我需要编写一个对具有相同功率的单声道求和的函数,单声道由以下结构定义:

typedef struct monom {
    int coefficient; 
    int power;
}MONOM;

我从工作中编写的功能是:

int sumMonomsWithSamePower(MONOM** polynomial, int size)
{
        int i, powerIndex = 0;

        for (i = 0; i < size; i++)
        {
            if ((polynomial[powerIndex])->power == (polynomial[i])->power)
                {
                        if (powerIndex != i)
                                (polynomial[powerIndex])->coefficient += (polynomial[i])->coefficient;

                }

                else
                        powerIndex++;
        }

        powerIndex++;
        *polynomial = (MONOM*)realloc(polynomial, powerIndex);
        return powerIndex;
}

通过以下调用调用它:

*polySize = sumMonomsWithSamePower(&polynomial, logSize);

多项式数组作为 MONOM 的排序数组(按幂升序排序)发送到函数。

我的问题是sumMonomsWithSamePower()函数的第 7 行崩溃,因为它无法通过以下方式看到数组中的元素。当我将数组的元素放入Watch list调试器时,我也无法使用多项式 [i] 看到它们,但如果我使用 (polynomial[0]+i),我可以清楚地看到它们。

这里发生了什么?

4

1 回答 1

1

我假设在外面sumMonomsWithSamePower()你已经分配polynomial了类似的东西polynomial = malloc( size * sizeof(MONOM) );(其他一切都不会与你的一致realloc())。所以你有一个 MONOM 数组,多项式 [1] 的内存位置是polynomial[0]+sizeof(MONOM)字节。

但是现在看在polynomial下面sumMonomsWithSamePower()的段落中,我将用ppoly(pointer to polynomial) 重命名它以避免与原始数组混淆:这里是 a MONOM **,因此ppoly[1]寻址sizeof(MONOM *)内存位置的字节ppoly[0] + sizeof(MONOM *)并将它们解释为指向 MONOM 结构的指针. 但是你有一个结构数组,而不是一个指针数组。将您的表达式替换为(*ppoly)[i].power(当然还有所有其他表达式),那部分就可以了。顺便说一句,这正是您提到的两个调试器语句的区别。

此外,看看我关于使用的评论powerIndex

于 2013-07-19T15:51:46.620 回答