2015-09-28 4 views
0

Я делаю хэш-таблицу в C, ключи которой имеют тип char *. Я храню ключ в самой таблице по причинам, выходящим за рамки этой проблемы. Хэш-таблица работает по большей части, за исключением следующей проблемы: когда размер таблицы превышает 2112 элементов, и я пытаюсь инициализировать ключи как NULL-указатели, я сталкиваюсь с ошибкой сегментации.Ошибка сегментации при переходе по выделенной памяти

Вот определение Хеш:

typedef struct hash_table 
{ 
    uint32_t size; // # of elements the table can store 
    uint32_t count; // # of elements in the table 
    char **keys; // The pointer to the first key. Each key is a char* 
    int32_t *vals; // The pointer to the first val. 
} hashTable; 

и вот где я инициализировать таблицу с NULL указатели в качестве ключей:

// Declare the pointer to the hash table 
hashTable *symbolTable = malloc(sizeof(hashTable)); 

// Set the hash table properties 
symbolTable->size = 7699; 
symbolTable->count = 0; 
symbolTable->keys = malloc(sizeof(symbolTable->keys[0]) * symbolTable->size); 
symbolTable->vals = malloc(sizeof(symbolTable->vals[0]) * symbolTable->size); 

// Initialize the keys to be NULL pointers. 
int i; 
for (i = 0; i < symbolTable->size; i++) 
{ 
    char **cp = symbolTable->keys + i * sizeof(symbolTable->keys[0]); 
    *cp = NULL; 
} 

Когда я запускаю программу, я получаю сегментацию ошибка в цикле for, когда i == 2111.

Я относительно новичок в распределении динамической памяти в C и застрял в этой проблеме в течение некоторого времени. Если у кого-нибудь есть понимание или совет, я бы очень признателен.

ответ

6

При настройке cp вам не нужно умножать i на sizeof. Арифметика указателя автоматически умножается на размер объекта, на который указывает указатель. В результате вы дважды умножались, так что вы писали далеко за пределами границ массива. Так оно и должно быть

char **cp = symbolTable->keys + i; 

Но вы можете просто использовать нормальную индексацию массива вместо:

symbolTable->keys[i] = NULL; 
+0

Оба эти решения работали. Спасибо за помощь. –

Смежные вопросы