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

释放C中为字符串分配的内存,c,memory-management,memory-leaks,trie,C,Memory Management,Memory Leaks,Trie,我陷入了内存分配和释放的问题 我正在尝试使用压缩的trie(Patricia)实现一个字典。我有一个trie库,当我从main调用它的函数时,它可以正常工作。然而,当我试图解析输入时,我有一个小问题 我有一个解析器库,它从标准输入读取一个单词,并从trie库调用insert函数。它这样称呼它: void tryInsert(char *commandLine, struct tree *t) { char *arg[3] = { NULL }; sscanf(co

我陷入了内存分配和释放的问题

我正在尝试使用压缩的trie(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”函数的三个调用现在标记为逗号,因为:

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

但是,由于我只插入了一个后缀,因此我失去了对前缀的控制

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

此外,当尝试将字符串
word
复制到
char-word1[256]
函数的
insert
中并对释放的字符串取消注释时,一切都停止工作


如果您能想出一些方法来解决这个问题,我将不胜感激。

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

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


此外,在依赖具有有效值的变量之前,确实应该检查
sscanf()
是否成功。如果它不返回
3
,则会出现解析问题,并且不会分配所有字符串。检查返回值。

您在哪里分配内存?您只分配了一个指针数组whoa。我从来没有见过
%ms
,不得不这样做。@Leeor在sscanfa期间,正如有人所说,您正在将指针数组初始化为零,但实际上没有为这些指针分配任何内存。我认为我们需要
insert
函数来回答您的问题。没有它,您的最后一句话有些晦涩。sscanf()成功是什么意思?
sscanf
返回存储的变量数,因此如果它没有返回3,则会发生一些事情。它还可以返回
EOF
,在这种情况下,您应该检查
ferror
以了解原因。一切都在感谢中。C确实是一种令人厌恶的语言;)