指向struct元素的指针

时间:2013-07-19 14:35:12

标签: c arrays pointers struct

我需要编写一个用相同功率求和的函数, monom由以下结构定义:

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]看到它们,但如果我使用(多项式[0] + i)我可以清楚地看到它们。

这里发生了什么?

1 个答案:

答案 0 :(得分:1)

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

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

此外,请查看我关于使用powerIndex

的评论