c - 为什么还没有分配空间就可以读写内存?

标签 c memory-management hashtable

作为练习,我正在尝试用 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/

相关文章:

c - 带有头文件和椅子的 3 维数组

c - 从文件加载并保存到数组

c - 我自己的打印屏幕键

c - 使用 FFTW 取消定义架构 x86_64 的符号

c - `realloc` 实际上是如何在后台工作的?

c - 指向 struct 的双指针中的第一个元素是 jiberrish

c++ - 引用计数智能指针引用计数如何工作?

c++ - 如何删除嵌套在 vector 中的列表中的元素

Java Hashtable 非恒定时间操作

c++ - ‘<’ 标记之前预期的构造函数、析构函数或类型转换