创建哈希表条目后立即读取访问冲突

Read access violation for a hashtable entry immediately after creation

我正在尝试编写一个 table-lookup 包,它适用于交易品种 table 管理。

名称和替换文本保存在 struct nlist 类型中,我有一个指向名称和替换文本的指针数组。

#define HASHSIZE 101

struct nlist {          // table entry
    struct nlist *next;     // next entry in chain
    char *name;             // defined name
    char *defn;             // replacement text
};

static struct nlist *hashtab[HASHSIZE] = { NULL };  // pointer table

查找例程在 table.

中搜索 s

// hash: form hash value for string s
unsigned hash(char *s)
{
    unsigned hashval;

    for (hashval = 0; *s != '[=11=]'; s++)
        hashval = *s + 31 * hashval;
    return hashval % HASHSIZE;
}

struct nlist *lookup(char *s)
{
    struct nlist *np;

    for (np = hashtab[hash(s)]; np != NULL; np = np->next)
        if (strcmp(s, np->name) == 0)
            return np;      // found
    return NULL;            // not found
}

安装例程使用查找来确定正在安装的名称是否已经存在;如果是这样,新定义将取代旧定义。否则,将创建一个新条目。

// install: put (name, defn) in hashtab
struct nlist *install(char *name, char *defn)
{
    struct nlist *np;
    unsigned hashval;

    if ((np = lookup(name)) == NULL) {  // not found
        np = (struct nlist *) malloc(sizeof(*np));
        if (np == NULL || (np->name = strdup(name)) == NULL)
            return NULL;
        hashval = hash(name);
        np->next = hashtab[hashval];
        hashtab[hashval] = np;
    } else      // already there
        free(np->defn);     // free previous defn
    if ((np->defn = strdup(defn)) == NULL)
        return NULL;
    return np;
}

在我的主例程中,在指针 p 上调用 printf 时抛出“访问冲突读取位置”异常。 此错误的原因是什么,我该如何解决?

int main()
{
    struct nlist *install(char *name, char *defn);
    struct nlist *p;
    void undef(char *name);

    
    p = install("DEFAULT", "ON");
    printf("%s\n",p->name);
    return 0;
}

我不确定安装例程中 np 分配的正确性,即采用 *np 的大小而不是仅使用 struct nlist *。 此外,我已经阅读了不需要额外强制转换的建议。

struct nlist *np;
...
np = (struct nlist *) malloc(sizeof(*np));

野餐。我没有包括