Я пытаюсь создать свой собственный Hash Table в C с нуля как упражнение, и я делаю один маленький шаг за раз. Но у меня небольшая проблема ...
Я объявляю структуру хэш-таблицы в качестве указателя, чтобы я мог инициализировать ее с нужным мне размером и увеличивать ее размер всякий раз, когда коэффициент загрузки высок.
Проблема в том, что я создаю таблицу только с 2 элементами (это только для целей тестирования), я выделяю память только для этих 2 элементов, но я все еще могу записывать в те области памяти, которые мне не нужны т. И я также могу читать области памяти, в которые я не записал.
Вот мой текущий код:
#include <stdio.h>
#include <stdlib.h>
#define HASHSIZE 2
typedef char *HashKey;
typedef int HashValue;
typedef struct sHashTable {
HashKey key;
HashValue value;
} HashEntry;
typedef HashEntry *HashTable;
void hashInsert(HashTable table, HashKey key, HashValue value) {
}
void hashInitialize(HashTable *table, int tabSize) {
*table = malloc(sizeof(HashEntry) * tabSize);
if(!*table) {
perror("malloc");
exit(1);
}
(*table)[0].key = "ABC";
(*table)[0].value = 45;
(*table)[1].key = "XYZ";
(*table)[1].value = 82;
(*table)[2].key = "JKL";
(*table)[2].value = 13;
}
int main(void) {
HashTable t1 = NULL;
hashInitialize(&t1, HASHSIZE);
printf("PAIR(%d): %s, %d\n", 0, t1[0].key, t1[0].value);
printf("PAIR(%d): %s, %d\n", 1, t1[1].key, t1[1].value);
printf("PAIR(%d): %s, %d\n", 3, t1[2].key, t1[2].value);
printf("PAIR(%d): %s, %d\n", 3, t1[3].key, t1[3].value);
return 0;
}
Вы можете легко увидеть, что я не выделил место ни для (*table)[2].key = "JKL";
, ни (*table)[2].value = 13;
. Я также не должен быть в состоянии прочитать ячейки памяти за последние 2 printfs
в main()
.
Может кто-нибудь, пожалуйста, объясните мне это, и если я могу / должен что-нибудь с этим сделать?
EDIT:
Хорошо, я понял кое-что о моем коде выше, который беспорядок ... Но у меня есть класс прямо сейчас, и я не могу обновить свой вопрос. Я обновлю это, когда у меня будет время. Извините за это.
РЕДАКТИРОВАТЬ 2:
Извините, но я не должен был публиковать этот вопрос, потому что я не хочу, чтобы мой код, как я опубликовал выше. Я хочу сделать что-то немного другое, что делает этот вопрос немного неуместным. Итак, я просто собираюсь предположить, что это был вопрос, на который мне нужен был ответ, и принять один из правильных ответов ниже. Затем я опубликую свои правильные вопросы ...