我目前正在使用拼写检查程序(根据CS50s pset5,对于那些知道它的人)。我正在使用TRIE进行搜索,但现在我正在卸载它。该函数第一次尝试free()时失败。我的猜测是它试图释放指针而不是指针指向的东西,但我可能完全错了。
我的具体问题是:为什么free()
功能失败? (错误:双重释放或损坏(输出):0x00000000006020c0 ***)
我对节点的定义:
typedef struct node
{
bool wordHere;
struct node* children[27];
}node;
我的卸载功能:
node* currentNodePtr = &root;
bool unload(void)
{
node* ptrArray[27] = {NULL};
for(int i = 0; i < 27; i++)
{
ptrArray[i] = currentNodePtr -> children[i];
}
free(currentNodePtr);
for(int c = 0; c < 27; c++)
{
if(ptrArray[c] != NULL)
{
currentNodePtr = ptrArray[c];
}
unload();
}
return 0;
}
答案 0 :(得分:2)
似乎没有动态分配对象root
。
因此指针currentNodePtr
不指向动态分配的对象。
node* currentNodePtr = &root;
因此你可能不会打电话
free(currentNodePtr);
用于此指针。
您必须最初将对象root
动态分配为任何其他节点。
第二个问题,你必须在if语句中包含函数的递归调用
if(ptrArray[c] != NULL)
{
currentNodePtr = ptrArray[c];
unload();
}
因为在函数的开头你不检查指针是否等于NULL
。
虽然在函数开头检查指针currentNodePtr
不等于NULL
会更好。
当函数使用全局变量时,也不是一个好主意。而不是使用全局变量currentNodePtr
使其成为函数的参数。
答案 1 :(得分:0)
感谢大家!问题是,根节点没有动态分配。 我不确定我应该如何动态分配根,所以我使用了这个简单的(虽然不是很优雅)修复:
node* currentNodePtr = &root;
bool unload(void)
{
node* ptrArray[27] = {NULL};
for(int i = 0; i < 27; i++)
{
ptrArray[i] = currentNodePtr -> children[i];
}
if(currentNodePtr != &root)
{
free(currentNodePtr);
}
for(int c = 0; c < 27; c++)
{
if(ptrArray[c] != NULL)
{
currentNodePtr = ptrArray[c];
unload();
}
}
return true;
}