自由(位置)运行时,我有问题。

void printTree(nodeT node, int hieght)
{
    int *position;
    position = (int*)malloc(hieght * sizeof(int*));
    for (int i = 0; i <= hieght; i++)
    {
        position[i] = 0;
    }
    BOOLEAN DONE = FALSE;
    while (DONE == FALSE)
    {
        printMoveDown(&node, position);
        printLEAFNode(&node, position);
        DONE = printMoveUp(&node, position);
        printSingleKey(&node, position);
    } 
    free(position);
    position = NULL;
}

我从VS2010收到的完整错误消息检测到了堆的损坏:在0x00031390的普通块(#64)之后。 CRT检测到该应用程序在堆结束后写入内存。

调试器说问题发生在以下内容时发生:dbgheap.c.c

extern "C" void __cdecl _free_dbg_nolock
line 1376:  if (!CheckBytes(pbData(pHead) + pHead->nDataSize, _bNoMansLandFill, nNoMansLandSize))
                if (pHead->szFileName) {..}
                else { this is where the program stops }

我尝试设置相同的情况,而较少的事情继续查看我是否可以缩小问题的范围。

void function (int y)
{
    int *x;
    x = (int*)malloc(y * sizeof(int*));
    free(x);
    x = NULL;
}

这与上面是同一件事,而没有for循环和循环。这有效。删除for循环是使它起作用的原因。我不知道为什么。我查看了CRT是什么,但这对我来说都是非常新的概念,我认为我可以在不知道这些CRT的情况下解决这个问题。

for循环将值分配给分配给位置的内存,除此之外,我无法想到为什么会引起问题。...实际上我考虑了这一点。我将循环更改为高度 + 1,以解决问题。

有帮助吗?

解决方案

它应该是:

position = malloc(hieght * sizeof(int));

或者:

position = malloc(hieght * sizeof *position);

这是您拥有的不确定行为。您可能只是很幸运,因为 intint* 是相同的大小。

典型的编写循环的正确方法是:

for (int i = 0; i < hieght; i++)
{
    position[i] = 0;
}

您也可以在此处使用Calloc:

position = calloc(hieght, sizeof *position);

并且内存将为您归零,因此您不必循环。

另外,如果这确实是C,则演员表是多余的。

其他提示

我认为循环中的问题是<=,它确实应该是<。因此,循环一次绕过太多,并破坏了堆上的下一个项目!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top