【发布时间】:2011-01-20 23:02:44
【问题描述】:
我正在尝试从头开始用 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; 分配空间。我也不应该能够读取main() 中最后两个printfs 中的内存位置。
有人可以向我解释一下吗?如果我可以/应该对此做些什么?
编辑:
好的,我已经意识到关于我上面的代码的一些事情,这是一团糟......但我现在有一个班级,无法更新我的问题。有时间我会更新这个。对此感到抱歉。
编辑 2:
对不起,我不应该发布这个问题,因为我不想要我上面发布的代码。我想做一些稍微不同的事情,这使得这个问题有点无关紧要。所以,我只是假设这是我需要答案的问题,并接受以下正确答案之一。然后我会发布我的正确问题...
【问题讨论】:
标签: c memory-management hashtable