我正在使用search.h
库通过hcreate
函数定义哈希表。
如何查看该表中的所有键? hsearch
始终需要一个条目来搜索(或存储)。
This是管理哈希表(hcreate
,hsearch
和hdestroy
)的所有三个函数的文档,但是没有提到如何遍历结构来获取所有存储的密钥。
在表格中存储条目时,我malloc
键值,因此希望能够轻松地释放这些malloc
'd值。
我可以避免将它们存储在一个单独的结构中,例如数组吗?
我不希望hdestroy
自动为我做这个,因为它无法知道key
是指向动态分配还是静态内存(或者如果我还没有释放了那段记忆。)
不能选择切换到其他哈希搜索表库。我必须这样做。我在CentOS上并使用GCC 4.1.2。
答案 0 :(得分:2)
没有标准功能可以迭代哈希表的条目。这个问题已解决here(在hdestroy
部分中):
重要的是要记住散列中包含的元素 调用hdestroy时的表不会被此函数释放。 程序代码负责释放这些字符串(如果 完全必要的)。释放所有元素内存是不可能的 没有额外的,单独保存的信息,因为没有功能 迭代散列表中的所有可用元素。如果它 真的有必要释放一个表和程序员的所有元素 在调用hdestroy之前,必须保留所有表元素的列表 他/她必须使用此列表释放所有元素的数据。这是非常的 不愉快的机制,它也表明这种哈希 表主要用于创建一次并使用的表 直到程序结束。
答案 1 :(得分:1)
在没有查看库的实际来源的情况下,我会说在创建哈希表之后无法移动它。您需要在单独的结构中记住malloc内存的指针。
坦率地说,我认为我不会用十英尺的杆子碰那个图书馆。 API存在许多问题hcreate
不返回句柄,然后将其传递给hsearch
或hdestroy
)相反,根据您的平台(您没有说明您使用的是Windows还是基于Unix的操作系统),我会仔细查看支持丰富数据集的glib
- 结构(documentation home)
哈希表的文档是here。那是图书馆的v2.42 - 它们没有“最新版本”的通用链接。
glib
是GNOME(Ubuntu UI)的核心,但您不需要使用任何gmainloop
或事件泵相关的功能。