Ric*_*ral 1 c memory-management hashtable
我正在尝试从头开始在C中构建自己的Hash Table作为练习,我一次只做一小步.但我有一点问题......
我将哈希表结构声明为指针,因此我可以使用我想要的大小初始化它,并在加载因子很高时增加它的大小.
问题是我正在创建一个只有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;
}
Run Code Online (Sandbox Code Playgroud)
你可以很容易地看到,我没有对分配的空间(*table)[2].key = "JKL";
,也没有(*table)[2].value = 13;
.我也不应该读取最后2 printfs
中的内存位置main()
.
有人可以向我解释一下,如果我可以/应该做些什么吗?
编辑:
好的,我已经意识到我的代码上面有一些事情,这是一个烂摊子......但我现在有一个课程,无法更新我的问题.我有空的时候会更新这个.对于那个很抱歉.
编辑2:
对不起,但我不应该发布这个问题,因为我不希望我的代码像上面发布的那样.我想做稍微不同的事情,这使得这个问题有点无关紧要.所以,我只是假设这是一个问题,我需要一个答案并接受以下正确答案之一.然后我会发布我的正确问题......
只是不要这样做,这是未定义的行为.
它可能在意外工作,因为你编写/读取程序实际上没有使用的一些内存.或者它可能导致堆损坏,因为您为了其目的而覆盖堆管理器使用的元数据.或者你可以覆盖其他一些不相关的变量,然后很难调试那个因此而变得疯狂的程序.或者其他任何有害的东西 - 无论是明显的还是微妙的 - 都可能发生.
只是不要这样做 - 只读/写你合法分配的内存.