我正在尝试使用<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/

10-10 13:05