我想在C中创建一个通用的链表。以下是节点的结构:
typedef struct node {
void *value;
int size; // n bytes
ind index; // index of the node
struct node *next;
} Node;
我的delete_node函数如下。搜索功能发送指向要删除的节点的指针。
Node *search_list(Node *list, void *data, int n_bytes);
int delete_node(Node *list, Node *to_be_deleted); // returns 1 on success
在delete_node
函数内部,我想释放void *value
指向的内存,然后释放为Node
本身分配的内存。
free(to_be_deleted->value); // Would this work??
free(to_be_deleted);
由于它是void
指针,我们不知道它指向的对象占用了多少字节。我们怎样才能为此腾出记忆?
对不起,如果这是一个愚蠢的问题?
答案 0 :(得分:3)
内存分配器可以跟踪内存分配的大小 - 没有必要告诉free()
要释放多少内存。
因此,你应该能够摆脱size
和n_bits
。
答案 1 :(得分:2)
free(to_be_deleted->value); // Would this work??
直接回答,Yes this will work.
简单的事情:
查看free()
和malloc()
void free(void *) // free takes void* as argument so it will work
void* malloc(sizeof(type))
在malloc
中,我们必须传递size
我们想要分配的字节数。
但是在free
中只是传递指针和在堆存储上分配给该指针的任何字节,它将被释放
答案 2 :(得分:1)
是,你写的内容应该有效。原因是malloc(它是一个库调用)创建元数据,用于确定哪些内存部分是空闲的以及哪些部分是可用的。当你调用free()时,实际上只是修改了这个元数据,以便后续调用malloc知道可以重用这个内存(注意大多数实现都不会将现有数据归零)。