C程序:使用链表数组的哈希表内存溢出

C程序:使用链表数组的哈希表内存溢出,c,linked-list,hashtable,C,Linked List,Hashtable,系统有16GB内存。我们用于存储在哈希表链表中的节点结构的大小为38字节。这说明我们可以在哈希表中存储多达4.52亿个节点。但只有在1300万个节点(约)之后,才会发生内存溢出 相关代码段如下所示: for (i=0;i<NO_OF_BUCKETS;i++) { nextptr = hashtable[i]; while (nextptr != NULL) { prevptr = nextptr; nextptr = ne

系统有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;
  }
(i=0;不精确; 免费(prevptr); } 哈希表[i]=NULL; }
现在这是一个错误的假设。你认为所有的RAM都会保留给你的应用程序中的数据吗?一点也不。还有操作系统、其他用户应用程序等,它们也需要内存,你甚至不能确切地知道它们需要多少。所以不要指望你能计算出你的链接li中的元素数量st实现。

你所说的
nextptr=nextptr->next是什么意思;
?没有
next
nextptr
。只有
NULL
。它应该是
prevptr->next=nextptr;
prevptr=prevptr->next;并且没有
免费(prevptr)
,否则你会松开指针。你是什么意思“内存溢出"?@noMAD否,假设
nextptr
指向一个包含
next
成员的结构,该成员是指向同一类型的指针,则代码是好的。命名是次优的。您的代码似乎是好的,但似乎与您正在谈论的内容无关。在哈希表中取消分配节点看起来像是清理代码。W这与你的问题有什么关系?你的问题到底是什么?你的内存不足吗?你会遇到什么错误?因此你的代码会释放哈希表中的所有项。听起来这不会导致内存不足错误,至少在已经释放了一些项之后是这样。可能它崩溃了,因为链接列表中有一个循环st或其他一些结构问题?是的,但38字节*452M列表元素不超过500 MB。不,38*452000 000=17 176000 000(3000字节小于16 GB),如果你不相信我,拿一个计算器。。。
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.