0

我的程序在第 7 行在此函数上崩溃,当我malloc()在发布模式下运行时调用时,我收到“Program.exe 已停止工作”消息,当我在调试器中运行时,大多数情况下它会成功,但有时我会得到这个消息(尤其是在较大的输入上): 碰撞

MONOM* polynomialsProduct(MONOM* poly1, int size1, MONOM* poly2, int size2, int* productSize)
{
    int i1, i2;
    int phSize = 1, logSize = 0;
    MONOM* product;

    product = (MONOM*)malloc(phSize*sizeof(MONOM));
    monomAllocationVerification(product);

    for (i1 = 0; i1 < size1; i1++)
    {
        for (i2 = 0; i2 < size2; i2++)
        {
            if (logSize == phSize)
            {
                phSize *= 2;
                product = (MONOM*)realloc(product,phSize*sizeof(MONOM));
                monomAllocationVerification(product);
            }

            product[logSize].coefficient = poly1[i1].coefficient * poly2[i2].coefficient;
            product[logSize].power = poly1[i1].power + poly2[i2].power;
            logSize++;
        }
    }

    mergeSort(product,logSize);
    *productSize = sumMonomsWithSamePower(product, logSize);

    return product;
}

我知道我正在处理内存错误和问题,但是有没有什么快速的方法来分析我的代码并查找内存错误?我看了我的代码十几次寻找这种错误,但一无所获。(我不想在这里发布代码,因为它有 420 行长)。

4

2 回答 2

1

首先,如果在第一次检测到堆损坏malloc,这意味着它发生得更早(不是在这个函数中或之前的传递中)。所以问题可能出在这段代码之外。

但是,代码在我看来也很可疑。

  1. monomAllocationVerification没有size参数,所以它应该只在一个monom上工作,但是你只realloc在指向第一个元素的指针上调用它一次,尽管已经为很多monom分配了空间。请澄清你的决定。

  2. 有点不清楚为什么sumMonomsWithSamePower应该返回一个大小,从而修改一个数组来存储一个值。可能是个怪癖,但仍然可疑。

更新

问题出在其他功能上;一些大小错误的重新分配。

于 2013-07-20T05:41:03.033 回答
0

我会检查 malloc() 的返回值并使用 perror() 来描述发生了什么错误。这里还有malloc()perror()的文档。

if((product = (MONOM*)malloc(phSize*sizeof(MONOM))) == NULL)
{
      perror("ERROR: Failed to malloc ");
      return 1;
      //perror() will display a system specified string to describe the error it may tell you the error
}

你也知道MONOM的尺寸吗?如果没有将以下行添加到您的代码中。

printf("MONOM SIZE = %i\n", sizeof(MONOM));
于 2013-07-20T05:29:20.047 回答