程序的其余部分是否可以访问局部变量,或者是否可以在不使用malloc的情况下加载哈希表

程序的其余部分是否可以访问局部变量,或者是否可以在不使用malloc的情况下加载哈希表,c,hashtable,C,Hashtable,这是我的节目 typedef struct node { char word[LENGTH + 1]; struct node* next; } node; static node* hashtable[MAX] = {NULL}; 然后是一些不相关的代码。主函数调用函数加载 bool load(const char* file_dic) { FILE* file = fopen(file_dic, "r"); char word[LENGTH+1];

这是我的节目

typedef struct node
{
    char word[LENGTH + 1];
    struct node* next; 
}
node;

static node* hashtable[MAX] = {NULL};
然后是一些不相关的代码。主函数调用函数加载

bool load(const char* file_dic)
{

    FILE* file = fopen(file_dic, "r");
    char word[LENGTH+1];
    while ( (fscanf(file,"%s",word)) != EOF)
    {
         int value = hashf(word);
         if(hashtable[value] == NULL)
         {
             hashtable[value] = malloc (sizeof(node));
             strcpy(hashtable[value]-> word,word);
             hashtable[value]-> next = NULL; 
         }
         // more code
    }
}
函数load实质上是加载哈希表中file_dic中的每个单词


是否可以在不使用malloc函数的情况下加载哈希表中的单词,从而使单词在整个程序中保持可访问状态。结合下面的所有内容,您可以实现一个只有零个malloc的哈希表,尽管这并不现实。但是,如果采取更合理的方法,可以将malloc减少到每个哈希表bucket一个

首先,您可以将整个文件读取到内存中,并仅使用一个malloc作为数据(简单的方法:获取文件大小,malloc内存,读取那么多数据)。然后扫描读取的文件,找到单词的开头,并用
'/0'
字节替换空白。作为奖励,这将取消您对单词长度的
限制

极端的、不实用的版本:如果您认为字符串不是以NUL结尾的C字符串,那么您可以
mmap
文件。但是,由于您可能不想更改文件,因此这些单词要么需要存储长度,要么使用空白作为字符串终止符,这两种情况对于C字符串函数都不是很方便。当然,有人在使用文件时编辑它会破坏你的表格


但是您仍然需要一个哈希桶中的单词列表,因此仅上述内容并不能减少malloc的数量,您需要去掉链表。您可以将链表(每个单词一个malloc)替换为(空bucket为零malloc,bucket为单词一个malloc)

极端的,不实用的版本(浪费总内存,在满存储桶上插入失败的风险):使每个存储桶中的单词列表成为一个固定大小的数组


最后,如果不需要重新灰化,请将哈希表更改为

静态节点哈希表[MAX];//固定大小哈希表数组

或者使用单个malloc允许动态大小:

static node *hashtable; // pointer to dynamically allocated hash table array
static size_t hashtable_size; // current size of hashtable

如果使用哈希表,则需要使用malloc。可能是因为在生成哈希键冲突时需要扩展。只需在
结构节点*hastable
之后删除
*
。为什么不想使用malloc?小调:1)建议
hashtable[value]=malloc(sizeof(*hashtable[value])。在IMO中,更不容易出错,更易于维护。2) 使用
fgets()
fscanf(文件“%s”,word)
相比,后者不能防止过多的输入。+1用于使用
size\u t hashtable\u size
重新调整表的大小(次要:两个
hashtable\u size
都应该是
static