更改函数内的指针

时间:2014-12-05 01:24:36

标签: c function pointers data-structures hash

这个函数正在调整哈希表的大小,我的问题是在我的resize函数完成后弄乱了temptable,我在我的resize函数结束时设置了table = temptable,而它在函数内部的地址是正确的。 ..但是一旦我们回到main函数,表指针永远不会更新。我明白这可以通过参考传递来解决。

但是,我根本不允许更改main中的任何内容,包括调用resize的方式。我也不允许更改resize_hash函数参数。允许更改的所有内容都是函数内的内容。

哈希表的结构:

typedef struct hash_table_ {
    int size;
    hash_entrys **buckets;
    void (*print_func)(void *);
} hash_table, *Phash_table;

来自main的调整大小函数调用:

resize_hash(table, HASH_SIZE + i*250);

功能代码:

void resize_hash(Phash_table table, int size){
    int h=0;
    Phash_table temptable;
    hash_entrys *head_re, *cur_re;
    temptable = new_hash(size,table->print_func);

    for(h=0;h<(table->size);h++){
        head_re=table->buckets[h];
        if(head_re!=NULL){
            for(cur_re=head_re;cur_re!=NULL;cur_re=cur_re->next){
                insert_hash(temptable,cur_re->key,cur_re->data);
            }
        }   
    }


    table=temptable;
    free(temptable);
}

1 个答案:

答案 0 :(得分:1)

被调用函数不能直接更改其参数。它可以传达信息的唯一方法是返回某些东西(所以你可以让resize_hash返回temptable,这可能是最好的解决方案)或者修改它拥有的东西指针。您无法修改指针表,因为resize_hash没有指向指针表的指针,但您可以修改指针表指向的哈希表。特别是,您可以重新分配原始哈希表的hash_entrys,然后相应地更改结构中的指针和大小。