【问题标题】:My function is returning segmentation fault error for aparently nothing wrong我的函数正在返回分段错误错误,显然没有错
【发布时间】:2020-11-01 11:51:22
【问题描述】:

我正在创建一个哈希表数据结构,并且我的初始化函数出现分段错误错误。代码如下:

void allocTableSlots(alu **table, int index){
    if(index == MAX)
        return;
    else{
        table[index] = calloc(1, sizeof(alu));
        table[index]->registration = -1;
        table[index]->next = -1;
        allocTableSlots(table, index+1);
    }
}

void initializateHashTable(hash *hashing){
    hashing = calloc(1, sizeof(hash));
    allocTableSlots(hashing->table, 0);
    hashing->collisionArea = 690;
}

我的结构是:

#define MAX 997

typedef struct alu{
    int registration;
    char name[80];
    char email[80];
    int next;
} alu;
typedef struct reg{
    alu *table[MAX];
    int collisionArea;
}hash;

错误出现: if(index == MAX) 关于allocTableSlots()函数

如果我将MAX 更改为MAX-1 或任何其他数字,例如500,错误仍然出现在位置499 之后,所以看起来不像是我试图访问我的数组的无效位置table

我已经尝试了一个迭代版本(以防我的递归有一些错误)但还是一样

【问题讨论】:

  • 您是否缺少指针转换,这是一个错字?
  • @Dev-il 你不需要在 C 中转换 void*。你在考虑 C++ 吗?
  • 为什么initializeHashTable 会覆盖传递给它的指针,而不是初始化它指向的结构?
  • 我无法重现该错误。但是initializateHashTable需要返回它分配的指针,或者它应该带一个hash **参数。
  • 我不建议为此使用递归。您可能会遇到堆栈溢出。

标签: c data-structures hash segmentation-fault runtime-error


【解决方案1】:

按照 cmets 中的建议,您很可能应该只从 init 函数返回指向已分配块的指针。此外,如果已知最大存储桶大小,如您的代码中的MAX,则代码简化为:

...
typedef struct reg {
    alu table[MAX];
    int collisionArea;
} hash;

hash *initializateHashTable(void) {
    hash *t = calloc(1, sizeof *t);
    if (!t) return NULL; // check calloc, just in case.
    
    /* Whatever initialization you want to perform. As per your code,
       setting registration and next members to -1 */
    for (int i = 0; i < MAX; i++) {
        t->table[i].registration = t->table[i].next = -1;
    }
    t->collisionArea = 690; // EDIT: Forgot the collisionArea
    return t;
}
    

【讨论】:

  • 我看到了 cmets 和 @vmt 发布的答案,现在我的函数已经修复并且可以正常工作了,谢谢大家!
猜你喜欢
  • 2015-02-20
  • 1970-01-01
  • 1970-01-01
  • 2021-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-18
  • 1970-01-01
相关资源
最近更新 更多