这是我存储字符串值的哈希表的代码。要在我的“插入”函数中使用线性探测,我需要检查指针在该特定哈希值处是否为NULL。我还没有完成我的插入功能,但我被卡住了,因为当我在insert函数中检查 if(the_hash_table [n] == NULL)时,它不会进入分支。在我打印“the_hash_table [1]”之前对值进行散列之前,它会打印“faz”,但是在我打印它之后,它会打印一些奇怪的字符。我哪里出错?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*
creates a hash table of size 10
*/
char** create_hash_table(){
char* the_hash_table[10]; // defines a hash table to store strings
*the_hash_table=malloc(sizeof(char*)*10); // allocates memory in the heap for the hash table
int i;
for(i=0;i<10;i++){ // this loop initializes the string pointers to NULL at the starting point of the hash table
the_hash_table[i]=NULL;
}
return &the_hash_table; // returns the address of the hash table to the main memory
}
/*
this is a method to insert a string into the relevant position of the hash table
*/
void insert(char* the_string,char** the_hash_table){
printf("%s",the_hash_table[1]);
int n=hash(the_string);
printf("%s",the_hash_table[1]);
if(the_hash_table[n] == NULL)
the_hash_table[n]=the_string;
}
答案 0 :(得分:4)
您尚未正确分配内存。
您将自动变量the_hash_table
定义为指针数组。您分配一些内存并将指针放在数组中的内存中。您立即用空指针覆盖该指针(以及the_hash_table
的其他元素)。
然后返回指向本地数组的指针,但一旦函数退出,该数组就不再存在。从其定义的函数返回指向自动变量的指针总是错误。
你应该做的是:
char** create_hash_table(void) {
char** the_hash_table = malloc(sizeof(*the_hash_table) * 10);
for (int i = 0; i < 10; ++i) {
the_hash_table[i] = NULL;
}
return the_hash_table;
}
因此,the_hash_table
是一个指向已分配内存的局部变量。您返回其值,即已分配内存的地址。然后在main
中free(the_hash_table)
而不是free(*the_hash_table)
。
此外,在hash
函数中,没有必要复制字符串:只需读取the_string[i]
中的字符即可。即使复制它有一点,你创建的缓冲区也是1字节太小,它需要strlen(the_string)+1
因为strlen
返回的长度不包括0终止字符串的字节。