2012-11-21 22 views
2

我想創造C.繼通用鏈表是節點的結構:如何釋放C中的n個字節的內存?

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指針,我們不知道有多少字節它指向的對象已經佔據。我們如何釋放內存? 對不起,如果這是一個愚蠢的問題?

+1

你很少計算C中的位;字節 - 是的,經常,但是位 - 不經常。 –

+0

@JonathanLeffler哦,是的,命名不好。我改變了它nbytes :) – zeronone

回答

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只是傳遞指針和任何字節分配到堆存儲該指針將被釋放

3

內存分配器會記錄自己的內存分配量有多大 - 不需要告訴free()要釋放多少內存。

因此,您應該能夠擺脫sizen_bits

1

,你寫的應該工作。原因是malloc(這是一個庫調用)創建的元數據用於確定哪些內存部分是空閒的,哪些是被佔用的。當你調用free()的時候,你實際上只是修改這個元數據,這樣後續對malloc的調用就知道這個內存可以被重用了(注意大多數實現不會使現有數據爲零)。