我环顾四周,但这里的大多数答案都是关于代码中堆损坏明显的地方,或者询问者已经确定了源代码的地方。
我有一个C程序(模拟赛车)为链表动态分配内存。然后,它根据节点中的值,从列表中的一个或多个节点将值复制到动态分配的2D数组中。每个节点在复制后都会被释放,并且列表头会被更新。重复此操作,直到列表中不再有节点(比赛结束)。
指向数组的指针返回到main并存储在3D数组中。
然后重复整个过程(新的链表、新的数组)。
在第二次迭代(第二次竞赛)结束时,我得到一个堆损坏错误,我无法找出是什么导致了它。
我试着按照这里的建议使用VLD:Memory allocation / Heap corruption in std::string constructor
但包括VLD我没有得到错误。
我还尝试启用调试堆函数:https://msdn.microsoft.com/en-us/library/x98tx3cf.aspx
这告诉我地址是0x596EBC5C,它似乎不包含我分配的任何内容,所以我不确定这是否有意义。
据我所知,我在这段代码中发现了错误,但我甚至不确定这一点,我不知道这将如何帮助我找到问题的根源。

void MoveFinishers(NODE **racehead, int **FinisherList, int raceLength) {
    static int numberOfFinishers = 0;
    NODE *head = *racehead;
    NODE *temp = *racehead;
    NODE *tempNext = NULL;
    while (head != NULL && head->car.distance >= raceLength)
    {
        FinisherList[0][numberOfFinishers] = head->car.number;
        numberOfFinishers++;
        head = head->next; //advance to the next finisher
    }

    *racehead = head; //change the list head to start with the first non-finisher

    //free all list elements before the first non-finisher
    while (temp != head)
    {
        tempNext = temp->next; //iterates through the temp values
        free(temp);
        temp = tempNext;
    } //end while
}

最佳答案

我终于明白了。不幸的是,我仍然无法通过调试器找到问题,而只是查看代码。
无论如何,问题在于:

static int numberOfFinishers = 0

我声明它是静态的,因为我需要它在单个种族中保持状态。
但是,在第一次比赛之后,我并没有重置计数器,因此实际上这开始在未分配的内存中存储值:
FinisherList[0][numberOfFinishers]

修复方法很简单,只需将其添加到函数的末尾:
    if (!head)
    {
        numberOfFinishers = 0;
    }

10-08 05:36