Моя функция возвращает ошибку ошибки сегментации, по-видимому, ничего плохого - PullRequest
0 голосов
/ 12 июля 2020

Я создаю структуру данных хеш-таблицы и в моей функции инициализации возникает ошибка сегментации. Вот код:

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

Я уже пробовал итеративную версию (на случай, если в моей рекурсии есть ошибка), но все та же

1 Ответ

0 голосов
/ 12 июля 2020

Как предлагается в комментариях, вам, скорее всего, следует просто вернуть указатель на выделенный блок из функции 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;
}
    
...