【问题标题】:Hashing of small dictionary小字典的散列
【发布时间】:2020-09-05 11:16:36
【问题描述】:

我想散列小字典(“字典/小”)。主文件编译正确,但在运行时会产生 "Segmentation fault" 消息,函数为 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;
        }
    }
}

【问题讨论】:

  • strcpy(newptr-&gt;name, buffer);。 name 字段尚未初始化,因此未指向任何有效内存。 malloc 内存为name 或将其更改为固定大小的数组。例如newptr-&gt;name = strdup(buffer))
  • 但我用 malloc 为节点初始化内存(以及指向下一个节点的名称和指针)
  • 你为 char 指针“name”分配了空间,而不是它应该指向的字符数组。

标签: c dictionary hash linked-list


【解决方案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);
}

【讨论】:

    猜你喜欢
    • 2011-08-18
    • 2010-11-12
    • 1970-01-01
    • 2020-11-08
    • 2013-12-05
    • 2016-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多