【问题标题】:How to free a TRIE?如何释放 TRIE?
【发布时间】:2017-12-21 02:43:51
【问题描述】:

我目前正在开发一个拼写检查器(对于那些知道它的人来说,每个 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;
}

【问题讨论】:

  • currentNodePtr设为unload的参数而不是全局变量会好很多。
  • 不幸的是,我的任务不允许我这样做,但它会工作得更好,同意!谢谢!

标签: c pointers free trie


【解决方案1】:

对象root似乎不是动态分配的。

所以指针currentNodePtr没有指向动态分配的对象。

node* currentNodePtr = &root;

因此你不能打电话

free(currentNodePtr);

对于这个指针。

您必须像任何其他节点一样动态分配对象root

第二个问题,你必须在 if 语句中包含函数的递归调用

    if(ptrArray[c] != NULL)
    {
        currentNodePtr = ptrArray[c];
        unload();
    }

因为在函数的开头你没有检查指针是否等于NULL

虽然最好在函数开头检查指针currentNodePtr不等于NULL

此外,函数使用全局变量也不是一个好主意。不要使用全局变量currentNodePtr,而是将其作为函数的参数。

【讨论】:

  • 谢谢!所以我只需要使用 malloc 来创建根,我应该很好?
  • @MichaelKeller 是的,您需要使用 malloc 来创建 root。此外,您至少必须在 if 语句中包含函数的递归调用。
【解决方案2】:

谢谢大家!问题是,根节点不是动态分配的。 我不确定我应该如何动态分配根,所以我使用了这个简单(虽然不是很优雅)的修复:

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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-13
    • 2018-01-17
    • 2018-10-02
    • 2012-05-03
    • 2011-09-15
    • 2011-05-03
    • 2010-10-16
    • 1970-01-01
    相关资源
    最近更新 更多