gpt4 book ai didi

C - 使用内部已存在的指针扩展结构数组

转载 作者:行者123 更新时间:2023-11-30 16:38:12 24 4
gpt4 key购买 nike

我有一个这样声明的结构数组

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 的调试,我意识到了这一点:假设 hashmap 大小为 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]->first (通常在扩展之前工作)的保存有一个 BUCKET,其 VALUE 变量由于某种原因突然设置为 NULL,因此崩溃。

我尝试将扩展后的每个"new"BASE 设置为 NULL,但使用 expandHashspace() 后保存函数仍然中断。

我做错了什么?

最佳答案

将内存重新分配给 hashmap 不起作用,因为 hashmap 是该方法中的局部变量。这意味着一切都变成了一场令人困惑的噩梦。

返回 HashMap 本身而不是返回任何内容解决了所有问题。

关于C - 使用内部已存在的指针扩展结构数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47583745/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com