次のコードの一部は、K & R.から単純なハッシュルックアップアルゴリズムの実装テーブルで秒間 ルックアップ検索され、それが発見された場所、またはNULLを指すポインタを返しますそれがなかった場合:K&Rハッシュ関数
struct hashElement *lookup(char *name){
struct hashElement *currentStruct;
int cmp;
for (currentStruct = hashTable[calcIndex(name)]; currentStruct; currentStruct = currentStruct->p)
if (cmp = strcmp(name, currentStruct->name) == 0)
return currentStruct;
return NULL;}
は名前がインストールされているかどうかを判断するために検索を使用してインストールすることは、すでに存在している:
struct nlist *install(char *name, char *defn)
{
struct nlist *np;
unsigned hashval;
if ((np = lookup(name)) == NULL){
np = (struct nlist *) malloc(sizeof(*np));
...}
...}
ルックアップがNULLを返す場合は、という名前のがハッシュテーブルにインストールされていることを意味します。このタイプはnlistになる新しい要素のメモリを割り当てる必要があります。
しかし、このnp = (struct nlist *) malloc(sizeof(*np));
に基づいて、ルックアップがNULLを返す場合、npはNULLのためにメモリを割り当てます。 * npの代わりに常にnlistのメモリサイズを割り当てるべきではありませんか?
「sizeof(* np)」を印刷するとどうなりますか?たぶん、あなたが実際にどのスペースを割り当てているのか、いくつか考えているでしょう。 – babon
ようこそスタックオーバーフロー! [malloc()とfamilyの戻り値をC ..にキャストしない理由についてのこのディスカッションを参照してください](https://stackoverflow.com/q/605845/2173917) –