【问题标题】:Freeing memory allocated for string in C释放为 C 中的字符串分配的内存
【发布时间】:2015-07-07 01:26:01
【问题描述】:

我遇到了内存分配和释放问题。

我正在尝试使用压缩特里树 (Patricia) 来实现字典。我有一个 trie 库,当我从 main 调用它的函数时它可以正常工作。但是,我在尝试解析输入时遇到了一点问题。

我有一个解析器库,它从标准输入中读取一个单词并从 trie 库中调用 insert 函数。它是这样称呼的:

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”函数的三个调用现在被标记为commets,因为:

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

但是,由于我只插入了一个后缀,我无法控制前缀。

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

此外,当尝试将字符串word 复制到insert 函数内的char word1[256] 并取消注释那些你释放的内容时,一切都停止工作了。

如果有任何解决方法的想法,我将不胜感激,

【问题讨论】:

  • 你在哪里分配内存?你只分配了一个指针数组
  • 哇。我从未见过%ms,不得不check the manual page
  • sscanf 期间的@Leeor
  • 正如有人已经说过的那样,您正在将指针数组初始化为零,但实际上并未为这些指针分配任何内存
  • 我认为我们需要insert 函数来回答您的问题。没有它,你的最后一句话有点神秘。

标签: c memory-management memory-leaks trie


【解决方案1】:

你的代码中有一些逻辑错误,这在处理动态内存时总是很可怕。

insert() 函数需要复制它希望存储的字符串部分,因为它只需要一个前缀。

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

【讨论】:

  • 什么意思 sscanf() 成功了?
  • sscanf 返回存储的变量数,所以如果它没有返回 3,就会发生一些事情。它也可能返回EOF,在这种情况下,您应该检查ferror 的原因。都在man page
  • 谢谢。 C 确实是一种令人作呕的语言 ;)
猜你喜欢
  • 1970-01-01
  • 2017-05-22
  • 1970-01-01
  • 2018-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-28
  • 1970-01-01
相关资源
最近更新 更多