为什么我没有分配空间时可以写入和读取内存?

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:
对不起,但我不应该发布这个问题,因为我不希望我的代码像上面发布的那样.我想做稍微不同的事情,这使得这个问题有点无关紧要.所以,我只是假设这是一个问题,我需要一个答案并接受以下正确答案之一.然后我会发布我的正确问题......

sha*_*oth 7

只是不要这样做,这是未定义的行为.

它可能在意外工作,因为你编写/读取程序实际上没有使用的一些内存.或者它可能导致堆损坏,因为您为了其目的而覆盖堆管理器使用的元数据.或者你可以覆盖其他一些不相关的变量,然后很难调试那个因此而变得疯狂的程序.或者其他任何有害的东西 - 无论是明显的还是微妙的 - 都可能发生.

只是不要这样做 - 只读/写你合法分配的内存.

  • +1:欢迎使用C编程.没有界限检查是语言的一部分.所以你可以做各种你不应该做的事情. (6认同)