c - 当我没有分配空间时,为什么可以读写内存?

原文 标签 c memory-management hashtable

我试图从头开始用C构建自己的散列表作为练习,我一次只做一小步但我有点小问题。。。
我将散列表结构声明为指针,这样就可以用我想要的大小初始化它,并在负载因子较高时增加它的大小。
问题是,我只创建了一个只有两个元素的表(只是为了测试目的),我只为这两个元素分配内存,但我仍然能够写入不应该写入的内存位置。我还可以读取没有写入的内存位置。
这是我当前的代码:

#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;分配空间我也不能读取printfs中最后2个main()中的内存位置。
有人能给我解释一下吗?如果我能/应该做些什么的话?
编辑:
好吧,我已经意识到了我上面代码的一些事情,这是一个混乱。。。但我现在有课,不能更新我的问题有时间我会更新的很抱歉。
编辑2:
很抱歉,我不应该发布这个问题,因为我不希望我的代码像上面发布的那样我想做一些稍微不同的事情,这使得这个问题有点无关紧要。所以,我假设这是一个问题,我需要一个答案,并接受下面的一个正确答案然后我会发布我的适当问题。。。

最佳答案

别这么做,这是不确定的行为。
它可能会意外地工作,因为您编写/读取了一些程序实际上不使用的内存。或者它会导致堆损坏,因为您会覆盖堆管理器用于堆损坏目的的元数据或者您可以覆盖一些其他不相关的变量,然后有困难的时候调试程序,因为这一点而发疯。或者任何其他有害的事情——无论是明显的还是微妙的,都可能发生。
只是不要这样做-你合法分配的只读/写内存。

关于c - 当我没有分配空间时,为什么可以读写内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2333364/

相关文章:

c - 从由前缀和后缀指定的char数组中提取字符串

algorithm - 哈希表实现

powershell - 检查相同的哈希表值

android - 离开 Activity 时我应该如何处理 ImageView?

PHP memory_get_peak_usage 和 ini_set ('memory_limit' , '-1' )

powershell - 将两个哈希表连接成一个

c - 需要帮助在Linux中的C中应用计时器

c - C中的多个宏

c - 哪个更快——对小数组元素进行排序或相乘?

c++ - malloc() 和 free() 如何工作?