我有一个声明为
的结构数组typedef struct bucket{
char * value;
char * key;
}BUCKET;
typedef struct item{
struct bucket * data;
struct item * next;
struct item * prev;
}ITEM;
typedef struct base{
struct item * first;
}BASE;
typedef BASE *SPACE;
它完美适用于我必须处理的所有事情。基本上我必须在C中执行一个hashmap。我设法做到了,但我完全陷入了这一项任务。我需要让用户调整hashmap的大小。
如果我想要一个大小为5的hashmap,我会这样做:
SPACE *hashmap = malloc(sizeof(SPACE *) * 5);
它完全符合程序的目的。
但是,如果我尝试使用以下代码块调整大小:
void expandHashspace(SPACE *hashmap){
printf("Please enter how large you want the hashspace to be.\n");
printf("Enter a number between %d and 100. Enter any other number to exit.\n>",hashSpaceSize);
int temp = 0;
scanf("%d",&temp);
if(temp>100 || temp<hashSpaceSize){
printf("Exiting...\n");
}
else {
SPACE *nw = NULL;
nw = realloc(hashmap, sizeof(SPACE *) * temp);
hashmap = nw;
hashSpaceSize = temp;
printf("Your hashspace is now %d rows long.\n", hashSpaceSize);
}
}
它也可以正常工作。但是,当我开始使用hashmap时,它最终会出现分段错误。或SIGSEGV信号11。
例如,我有以下显示功能。
void displayHashspace(SPACE *hashmap){
printf("\n");
int j = 0;
for(int i = 0; i < hashSpaceSize && hashmap; i++){
BASE *linkedList = hashmap[i];
if(linkedList) {
ITEM *node = linkedList->first;
printf("\n[HASH %d]\n", i);
while (node) {
printf("\t[BUCKET %d]\n\t[VALUE] : %s\n\t[KEY] : %s\n\n",j, node->data->value, node->data->key);
node = node->next;
j++;
etc...
使用CLion的调试,我意识到这一点:
我们假设散列图大小为3.这意味着只存在hashmap [0-2]。
如果我将hashmap的大小调整为,让我们说10,它允许我调整大小。
但是,在显示时,hashmap [3]的地址真的很奇怪。
虽然每隔一个地址都很长,几乎有8位数或更多,但hashmap [3]的地址始终为0x21
。
在此之后,一旦它到达ITEM *node = linkedList->first;
,其中linkedList是hashmap [3],就会发生分段错误。
这是另一个例子。这是我的保存功能:
void saveHash(SPACE *hashmap){
FILE *f = fopen("hashmap.hsh","w");
fprintf(f,"%d\n",hashSpaceSize);
for(int i = 0; i < hashSpaceSize;i++){
if(hashmap[i]){
ITEM *save = hashmap[i]->first;
do{
fprintf(f,"---\n%s\n%s\n",save->data->value,save->data->key);
save = save->next;
}while(save);
etc...
在这里,故事有所不同。它只能在调整大小后崩溃之前到达hashmap [0]。使用调试器,我发现不知何故,设置为hashmap [0] - &gt; first(通常在扩展之前有效)的save有一个BUCKET,其VALUE变量由于某种原因突然设置为NULL,因此崩溃
我尝试设置每个&#34; new&#34;扩展为NULL后BASE,但使用expandHashspace()
后保存功能仍然中断。
我做错了什么?
答案 0 :(得分:0)
将内存重新分配给hashmap无效,因为hashmap是该方法中的局部变量。意味着一切都变成了令人困惑的噩梦。
返回hashmap本身而不是返回任何问题解决了所有问题。