C语言 小字典的哈希



我想散列小字典("字典/小"(。主文件编译正确,但在运行时它会生成带有函数insert()"分段错误">消息(特别是malloc()的问题,但我不知道是什么(。

哈希.c

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <ctype.h>
#include <string.h>
typedef struct node
{
char* name;
struct node* next;
}
node;
node* first[26] = {NULL};
int hash(const char* buffer)
{
return tolower(buffer[0]) - 'a';
}
void insert(int key, const char* buffer)
{
node* newptr = malloc(sizeof(node));
if (newptr == NULL)
{
return;
}
strcpy(newptr->name, buffer);
newptr->next = NULL;
if (first[key] == NULL)
{
first[key] = newptr;
}
else
{
node* predptr = first[key];
while (true)
{
if (predptr->next == NULL)
{
predptr->next = newptr;
break;
}
predptr = predptr->next;
}
}
}

在函数insert()中,您可以正确分配新节点:

node* newptr = malloc(sizeof(node));

通过这种方式,您可以为完整的结构节点腾出空间:指向node指针和指向char的指针。但是您不会分配这些指针应该指向的空间。

因此,当您在字段中复制输入缓冲区name您正在执行非法尝试,以写入尚未分配甚至未初始化的char *指针:

strcpy(newptr->name, buffer);

在写入所有指针之前,需要分配所有指针(或至少初始化为有效的内存位置(。在您的情况下:

newptr->name = malloc( strlen( buffer ) + 1 );
if( newptr->name )
{
strcpy(newptr->name, buffer);
}

相关内容

  • 没有找到相关文章

最新更新