【问题标题】:C- program : Memory overflow for hash table using array of linked listsC-程序:使用链表数组的哈希表内存溢出
【发布时间】:2012-05-12 01:52:03
【问题描述】:

系统有 16GB 内存。我们用于存储在哈希表链表中的节点结构大小为 38 字节。这表明我们可以在哈希表中存储多达 4.52 亿个节点。但只有在 1300 万个节点(大约)之后才会发生内存溢出。

相关代码段是这样的:

for (i=0;i<NO_OF_BUCKETS;i++)
  {  
    nextptr = hashtable[i];
    while (nextptr != NULL)
      {
        prevptr = nextptr;
        nextptr = nextptr->next;
        free(prevptr);
      }
    hashtable[i] = NULL;
  }

【问题讨论】:

  • nextptr = nextptr-&gt;next; 是什么意思??没有nextnextptr。只有NULL。它应该是 prevptr-&gt;next = nextptr; prevptr = prevptr-&gt;next; 和 NO free(prevptr) 否则你会失去指针。
  • “内存溢出”是什么意思?
  • @noMAD 不,假设nextptr 指向一个包含next 成员的结构,该成员是指向同一类型的指针,代码没问题。命名并不理想。
  • 您的代码看起来不错 - 但它似乎与您正在谈论的内容没有任何关系。它看起来像清理代码以释放哈希表中的节点。这和你的问题有什么关系?你的问题到底是什么?你的内存不足了吗?你得到了什么错误
  • 所以你的代码释放了哈希表中的所有项目。听起来这不会导致内存不足错误,至少在已经释放了一些之后。可能是因为链表中有循环或其他结构问题而导致崩溃?

标签: c linked-list hashtable


【解决方案1】:
System has 16GB RAM. Our node structure for storing in the linked list of the hash table has a size of 38bytes. This tells that we can store up to 452million nodes in the hash table.

现在这是一个错误的假设。您认为所有的 RAM 都会保留给应用程序中的数据吗?一点也不。有操作系统、其他用户态应用程序等也需要内存,你甚至无法准确说出它们需要多少内存。所以不要指望你可以计算出你的链表实现中的元素数量。

【讨论】:

  • 是的,但 38 字节 * 452 M 列表元素不超过 500 MB。
  • NOPEEEEEE... 38 * 452 000 000 = 17 176 000 000(3 000 000 字节小于 16 GB),如果您不相信我,请拿一个计算器...
猜你喜欢
  • 2013-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-11
  • 2011-08-17
  • 2012-04-30
  • 2019-09-22
  • 2016-11-26
相关资源
最近更新 更多