作为练习,我正在尝试用 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()
中最后 2 个 printfs
的内存位置。
有人可以向我解释一下吗?我是否可以/应该做些什么?
编辑:
好的,我已经意识到我上面的代码的一些事情,这是一团糟......但我现在正在上课,无法更新我的问题。我会在有空的时候更新这个。对此感到抱歉。
编辑 2:
对不起,但我不应该发布这个问题,因为我不想要我上面发布的代码。我想做一些稍微不同的事情,这使得这个问题有点无关紧要。所以,我只是假设这是一个我需要回答的问题,并接受下面的正确答案之一。然后我会发布我的适当问题...
最佳答案
只是不要这样做,这是未定义的行为。
它可能会意外工作,因为您写入/读取了一些程序实际上并不使用的内存。或者它可能导致堆损坏,因为您覆盖了堆管理器用于其目的的元数据。或者您可以覆盖一些其他不相关的变量,然后很难调试因此而变得疯狂的程序。或者任何其他有害的事情——无论是明显的还是微妙的但严重的——都可能发生。
只是不要这样做 - 只读/写您合法分配的内存。
关于c - 为什么还没有分配空间就可以读写内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2333364/