2012-05-02 4 views
-2

システムには16GBのRAMがあります。ハッシュテーブルのリンクリストに格納するためのノード構造は、38バイトのサイズです。これは、ハッシュテーブルに最大452millionのノードを格納できることを示しています。しかし、1300万ノード(約)後にのみ、メモリのオーバーフローが発生します。C-プログラム:リンクリストの配列を使用したハッシュテーブルのメモリオーバーフロー

関連するコード・セグメントはこれです:今、それは間違った前提だ

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

'nextptr = nextptr-> next;とはどういう意味ですか? 'nextptr'に' next'はありません。 'NULL'だけがあります。これは 'prevptr-> next = nextptr;' 'prevptr = prevptr-> next;' 'と' 'prevptr''でなければなりません。 – noMAD

+2

「メモリオーバーフロー」とはどういう意味ですか? –

+4

@noMADいいえ、 'nextptr'が同じタイプへのポインタである' next'メンバーを含む構造体を指しているとすれば、コードは問題ありません。命名は準最適です。 –

答えて

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がアプリケーションのデータ用に予約されていると思いますか?どういたしまして。オペレーティングシステムや他のユーザーランドアプリケーションなどもあり、メモリが必要です。必要な量を正確に知ることさえできません。したがって、リンクリスト実装の要素数を計算できるとは思わないでください。

+0

はい、38バイト* 452 Mのリスト要素は約500 MBを超えません。 – Ben

+1

NOPEEEEEE ... 38 * 452 000 000 = 17 176 000 000(3 000 000バイト未満16 GB)、あなたが私を信じていない場合計算機をつかんでください... –

+1

ahem。はい、私はあなたが正しいと思います。 – Ben

関連する問題