我在运行免费(位置)时遇到问题。
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获得的完整错误消息是HEAP CORRUPTION DETECTED:正常块(#64)后面的0x00031390。 CRT检测到应用程序在堆结束后写入内存。
调试器表示问题出现在:dbgheap.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循环和while循环的情况相同。这有效。删除for循环是它的工作原理。我不知道为什么。我查了一下CRT是什么,但这对我来说都是很新的概念,我认为我可以在不知道这些CRT的情况下解决这个问题。
for循环将值分配给分配给位置的内存,除此之外我无法想到为什么会导致问题....实际上现在我想到了它。我将循环更改为高度+ 1以解决问题。
答案 0 :(得分:3)
应该是:
position = malloc(hieght * sizeof(int));
或:
position = malloc(hieght * sizeof *position);
这是你所拥有的未定义行为。您可能只是幸运,因为int
和int*
的大小相同。
编写循环的典型正确方法是:
for (int i = 0; i < hieght; i++)
{
position[i] = 0;
}
你也可以在这里使用calloc:
position = calloc(hieght, sizeof *position);
并且内存将为您归零,因此您无需循环。
另外,如果这确实是C,则演员阵容是多余的。
答案 1 :(得分:0)
我认为循环中的问题是&lt; =它应该是&lt;。 因此,循环过多一次并破坏堆上的下一个项目!