我正在尝试使用<search.h>
中的哈希表,但遇到了一些困难。
在男子中,他们说带有FIND动作的hsearch使用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转换为小写,并且我必须能够执行add(“ sOmeTHing”)。使用malloc我设法完成了我想做的所有事情,但是我深感我无法释放任何东西...
你能帮我吗? :)
最佳答案
您正在存储指向“ newWord”空间超出其寿命的指针。换句话说,“ newWord”位于函数“ add”的本地,这意味着它在函数返回时消失。发生这种情况时,您存储的地址-e.key = newWord
会晃来晃去。
使用malloc我设法完成了我想做的所有事情,但是我很害怕
无法释放任何东西
使用malloc
是处理此问题的一种理智的方法:您需要一个对象,该对象的功能超出其功能范围。
真正的解决方案是使用允许您传递自己的比较函数的API。与此问题相比,POSIX指定hsearch
和朋友的事实是一个很小的好处。
Linux手册确实提供了这些“解决方案”来释放内存:
如果需要释放这些缓冲区(可能是因为该程序是
反复创建和销毁哈希表,而不是创建一个
寿命匹配程序的单个表),然后
程序必须维护允许其执行的簿记数据结构
释放他们。
关于c - hsearch之前如何操作字符串,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27663431/