簡體   English   中英

在C中制作哈希圖時遇到指針問題

[英]Trouble with pointers while making hashmap in C

對於C語言的介紹,我需要制作一個哈希表。 這些是我到目前為止所做的結構:

typedef struct HashEntry {
    char *key;
    void* data;
    struct HashEntry *next;
}HashEntry;

typedef struct HashMap {
    size_t key_space;
    hash_function* function;
    HashEntry *data;
}HashMap;

當我想創建一個新的哈希表時,請使用以下命令:

HashMap *hm = calloc(1, sizeof(HashMap));
hm->data = calloc(key_space, sizeof(HashEntry)); 

到目前為止,我認為這是一個不錯的設計,但是當我想添加一個具有已經存在於地圖中的鍵的值時,我遇到了一些問題。 (在這種情況下,我希望釋放舊值,並分配新值。

我認為以下代碼可以解決問題:

void* old = current->data;
free(old);
current->data=malloc(length);
current->data = newData;     // newdata is a void* type

但是我的代碼只是停止運行,我想我在指針上犯了一個錯誤,但是嘗試查找了很長時間之后,我有點沮喪。

你們知道我在做什么錯嗎?

問題后的一些澄清:代碼在以下時間停止執行:

free(old);

如果我取消注釋就可以了,但是為什么我不能釋放數據呢?

長度是我要保存的void *字符串的大小。

您很可能需要更換

current->data = newData;

用類似的東西

memcpy(current->data, newData, length);

我假設newData是指向您的新數據的指針。 current->data是指向您首先釋放然后再分配的內存的指針。

為了能夠使用memcpy() ,必須在文件頂部添加#include <string.h>

當您取消注釋free(old)時,原始代碼似乎可以正常工作,因為您只需要在哈希圖中輸入原始newData 指針即可 如果稍后嘗試free()它們,則會發生壞事。 我假設您想將newData包含的數據輸入到hasmap中,而不僅僅是指向數據的指針

請注意,編譯器在這里幾乎沒有幫助。 C不是托管語言,這意味着您需要自己維護所有內存塊的生命周期和所有指針的語義。 有些指針指向malloc的內存,有些指針指向靜態數據,這實際上取決於您和您的程序是否要保持一致性。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM