在C语言中释放为字符串分配的内存

3
我在内存分配和释放方面遇到了问题。
我正在尝试使用压缩字典树(Patricia)来实现一个字典。我有一个Trie库,当我从主函数调用其功能时,它可以正常工作。然而,在尝试解析输入时,我遇到了一些小问题。
我有一个解析库,从标准输入读取单词并调用Trie库中的“插入”函数。它是这样调用的:
void tryInsert(char *commandLine, struct tree *t) {
        char *arg[3] = { NULL };
        sscanf(commandLine, "%ms %ms%ms", &arg[0], &arg[1], &arg[2]);
        if (arg[1] == 0 || arg[2] != 0 || !consistsOfSmallCases(arg[1]))
                printf("ignored\n");
        else
                //inserting arg[1] into tree
                insert(t, arg[1]);
//      free(arg[0]);
//      free(arg[1]);
//      free(arg[2]);
}

"free" 函数的三个调用现在被标记为注释,因为:

insert 函数有两个参数:一个 trie 和一个 char *word。在这个函数内部,我将 word 的一个后缀插入到 trie 的某个新位置。这意味着我不想立即释放为字符串分配的内存。

然而,由于我只插入了一个后缀,我失去了前缀的控制权。

这意味着如果在清除 trie 的 clear 函数内部调用 free(node->content),我实际上并没有释放所有的已分配内存。

此外,在尝试将字符串 word 复制到 char word1[256] 中并取消注释那三个释放时,一切都停止了工作。

我将感激任何关于如何处理这个问题的想法。


你在哪里分配内存?你只分配了一个指针数组。 - Leeor
3
哇,我从未见过%ms,不得不查看手册页 - unwind
@Leeor 在 sscanf 中 - Jytug
就像有人已经说过的那样,您正在将指针数组初始化为零,但实际上并没有为这些指针分配任何内存。 - cerkiewny
我认为我们需要使用“插入”函数来回答你的问题。如果没有它,你最后一句话有些难以理解。 - Roland W
显示剩余2条评论
1个回答

2

你的代码有一些逻辑错误,这在处理动态内存时总是让人感到害怕。

insert()函数需要对其希望存储的字符串部分进行复制,因为它只想要前缀部分。

另外,在依赖变量具有有效值之前,你真的应该检查sscanf()是否成功。如果它不返回3,则存在解析问题,而不是所有字符串都已分配。请检查返回值。


sscanf() 成功是什么意思? - Jytug
sscanf 返回存储的变量数,所以如果它没有返回3,就表示发生了某些事情。它也可能返回 EOF,在这种情况下,您应该检查 ferror 的原因。所有信息都在手册页面中。 - David K-J
谢谢。C确实是一种令人讨厌的语言 ;) - Jytug

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接