我正在尝试使用<search.h>
中的哈希表,但我遇到了一些困难。
在男人中,他们说利用FIND动作进行搜索,使用strcmp确定你搜索的内容是否匹配。
否则
add("foo");
find("foo");
此代码有效:
void add(char *word) {
ENTRY e, *ep;
e.key = word;
e.data = (int *) 1;
ep = hsearch(e, ENTER);
}
void find(char *word) {
ENTRY f, *fp;
f.key = word;
fp = hsearch(f, FIND);
if (fp == NULL) {
printf("This code does not work\n");
} else {
printf("This code works\n");
}
}
这个不是
void add(char *word) {
ENTRY e, *ep;
char newWord[100];
strcpy(newWord, word);
e.key = newWord;
e.data = (int *) 1;
ep = hsearch(e, ENTER);
if (strcmp(word, newWord) == 0) {
printf("According to strcmp, those words are equals\n");
}
}
我必须做strcpy行,因为我需要将word转换为lowercases而且我必须能够添加(“sOmeTHing”)。使用malloc我设法做了我想做的一切,但我很害怕我无法释放任何东西......
你能帮帮我吗? :)答案 0 :(得分:0)
您正在存储指向&#34; newWord&#34;的空间的指针。超越其一生。换句话说,&#34; newWord&#34;功能是本地的&#34;添加&#34;这意味着在函数返回时死亡。当发生这种情况时,您存储的地址 - e.key = newWord
将变为悬空。
使用malloc我设法做了我想做的一切,但我很害怕 什么都不能释放
使用malloc
是一种有点理智的方法来处理这个问题:你需要一个比这个功能更长的对象。
真正的解决方案是使用允许您传递自己的比较功能的API。与此问题相比,POSIX指定hsearch
和朋友的事实是一个小好处。
Linux手册确实提供了这些&#34;解决方案&#34;释放记忆:
如果需要释放这些缓冲区(可能是因为程序是 反复创建和销毁哈希表,而不是创建一个 单个表,其生命周期与程序的生命周期匹配),然后是 程序必须保持允许它的簿记数据结构 释放他们。