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

时间:2017-11-30 22:33:20

标签: c arrays struct malloc realloc

我有一个声明为

的结构数组
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()后保存功能仍然中断。

我做错了什么?

1 个答案:

答案 0 :(得分:0)

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

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