2

我想在 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指针,我们不知道它所指向的对象占用了多少字节。我们如何释放内存呢?对不起,如果这是一个愚蠢的问题?

4

3 回答 3

3

内存分配器自己跟踪内存分配的大小——无需告诉free()要释放多少内存。

因此,您应该能够摆脱sizeand n_bits

于 2012-11-21T06:20:43.757 回答
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只需传递指针以及在堆存储上分配给该指针的任何字节,它将被释放

于 2012-11-21T06:21:59.323 回答
1

的,你写的应该有效。原因是 malloc(这是一个库调用)创建元数据,用于确定哪些内存部分是空闲的,哪些部分被占用。当您调用 free() 时,您实际上只是在修改此元数据,以便后续对 malloc 的调用知道可以重新使用此内存(请注意,大多数实现不会将现有数据归零)。

于 2012-11-21T06:32:26.277 回答