簡而言之,我嘗試使用void指針作爲函數指針的參數,但得到編譯器錯誤「無效使用void表達式」。將void指針傳遞給函數指針
我有一個雙向鏈表(DLL),其節點結構如下:
typedef struct DL_LIST
{
uint16 tag; /* Object ID tag */
struct DL_LIST *previous;
struct DL_LIST *next;
void *object; /* A pointer to this node's object */
uint32 size; /* The size of this node's object, in bytes */
} DL_LIST;
我還具有以下功能,其用於刪除單個這樣的節點:
void dl_delete(DL_LIST *node, void (*dl_destructor)(void*)) {
if (node != NULL) {
dl_extract(node); /* Removes the node from the list */
if (node->object != NULL) {
(*dl_destructor)(node->object);
free(node->object);
}
free(node);
}
}
其中節點提取功能是:
DL_LIST *dl_extract(DL_LIST *node) {
if (node != NULL) {
if (node->previous != NULL) {
node->previous->next = node->next;
}
if (node->next != NULL) {
node->next->previous = node->previous;
}
node->previous = NULL;
node->next = NULL;
}
return node;
}
這裏的想法是能夠通過一個單獨的可以存儲在節點中的每種類型的object
的析構函數。此析構函數將一個指向該對象的指針作爲參數,並用於釋放由object
的子項使用的任何堆內存。
,當我嘗試打電話dl_delete()
從設計到刪除整個DLL中的函數時,發生上述錯誤:
void dl_destroy(DL_LIST **list, void (*dl_destructor)(void*)) {
DL_LIST *marker;
DL_LIST *previous_node;
if (*list != NULL) {
previous_node = (*list)->previous;
while (previous_node != NULL) {
marker = previous_node->previous;
dl_delete(previous_node, (*dl_destructor)(previous_node->object));
previous_node = marker;
}
/* Code removed for brevity */
}
}
我已閱讀this介紹函數指針,但我仍然無法確定如何補救問題。我非常感謝解釋我做錯了什麼。
對於您可能要包括你的'dl_extract(節點)的問題'功能完整性。 – Floris 2013-02-13 03:13:59
@弗洛裏感謝您的建議。 – RBE 2013-02-13 03:18:42