小字典的哈希

问题描述 投票:0回答:1

我想对小字典("dictionariessmall")进行哈希处理。主文件正确编译,但在运行时产生了 "分段故障" 带功能的信息 insert()malloc()但我不知道是什么)。)

HASH.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;
        }
    }
}
c dictionary hash linked-list
1个回答
1
投票

在函数 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);
}
© www.soinside.com 2019 - 2024. All rights reserved.