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



我正在尝试编写一个适用于符号表管理的表查找包。

名称和替换文本保存在结构 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

查找例程在表中搜索 s。


// hash: form hash value for string s
unsigned hash(char *s)
{
unsigned hashval;
for (hashval = 0; *s != ''; 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("%sn",p->name);
return 0;
}

我不确定在安装例程中分配 np 的正确性,即采用 *np 的大小而不仅仅是结构 nlist *。 此外,我读过建议,不需要额外的演员阵容。

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

野餐。我没有包括

相关内容

  • 没有找到相关文章

最新更新