[英]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.