从(search.h)哈希搜索表中获取所有密钥

时间:2015-02-11 15:10:58

标签: c hashtable

我正在使用search.h库通过hcreate函数定义哈希表。

如何查看该表中的所有键? hsearch始终需要一个条目来搜索(或存储)。

This是管理哈希表(hcreatehsearchhdestroy)的所有三个函数的文档,但是没有提到如何遍历结构来获取所有存储的密钥。

在表格中存储条目时,我malloc键值,因此希望能够轻松地释放这些malloc'd值。

我可以避免将它们存储在一个单独的结构中,例如数组吗?

我不希望hdestroy自动为我做这个,因为它无法知道key是指向动态分配还是静态内存(或者如果我还没有释放了那段记忆。)

不能选择切换到其他哈希搜索表库。我必须这样做。我在CentOS上并使用GCC 4.1.2。

2 个答案:

答案 0 :(得分:2)

没有标准功能可以迭代哈希表的条目。这个问题已解决here(在hdestroy部分中):

  

重要的是要记住散列中包含的元素   调用hdestroy时的表不会被此函数释放。   程序代码负责释放这些字符串(如果   完全必要的)。释放所有元素内存是不可能的   没有额外的,单独保存的信息,因为没有功能   迭代散列表中的所有可用元素。如果它   真的有必要释放一个表和程序员的所有元素   在调用hdestroy之前,必须保留所有表元素的列表   他/她必须使用此列表释放所有元素的数据。这是非常的   不愉快的机制,它也表明这种哈希   表主要用于创建一次并使用的表   直到程序结束。

答案 1 :(得分:1)

在没有查看库的实际来源的情况下,我会说在创建哈希表之后无法移动它。您需要在单独的结构中记住malloc内存的指针。

坦率地说,我认为我不会用十英尺的杆子碰那个图书馆。 API存在许多问题

  • 恶劣的文件
  • 该库只能支持单个哈希表(请注意hcreate不返回句柄,然后将其传递给hsearchhdestroy
  • 无法走路或检索钥匙严重限制了它的使用。

相反,根据您的平台(您没有说明您使用的是Windows还是基于Unix的操作系统),我会仔细查看支持丰富数据集的glib - 结构(documentation home

哈希表的文档是here。那是图书馆的v2.42 - 它们没有“最新版本”的通用链接。

glib是GNOME(Ubuntu UI)的核心,但您不需要使用任何gmainloop或事件泵相关的功能。