程序的其余部分是否可以访问局部变量,或者是否可以在不使用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
)