這個問題在這里已經有了答案: C中的函式指標是如何作業的? (11 個回答) 昨天關閉。
我正在做一個 C 練習,我們得到了原型,我們必須把它們變成函式。我偶然發現了以下原型:
void ft_lstdelone(t_list *lst, void (*del)(void*))
這個函式應該從鏈表中洗掉一個節點,但我不明白第二個引數“ void (*del)(void*) ”中發生了什么。
練習的描述有:
- 引數 -
- #1 要釋放的元素。
- #2 用于洗掉內容的函式地址。
- 描述 - 將元素作為引數并使用作為引數給出的函式“del”釋放元素內容的記憶體并釋放元素。不得釋放 'next' 的記憶體。
我從中得出,我必須使用函式作為引數,但這沒有任何意義。
有人可以幫我解開這意味著什么嗎?
uj5u.com熱心網友回復:
這實際上很有意義。它是一個函式指標,即ft_lstdelone會找到元素的位置。如果它是第一個元素,那么新的第一個元素將是它的下一個。如果它是最后一個元素,那么它的前一個元素將指向 null。否則它的前一個將指向它的下一個。
但是,您將如何洗掉實際專案?你會打電話free嗎?首先,這似乎是一種合乎邏輯的方法,但是如果您仔細考慮一下,您就會意識到這是一種幼稚的方法。如果您的串列包含復合型別的元素,則呼叫free它會釋放資料的地址,但資料的內部成員仍將保留一些已分配的資料。這會引發記憶體泄漏的可能問題,因此,根據您專案中的資料型別,您必須以不同的方式釋放它。這僅在您呼叫 時才知道ft_lsdelone,因為此時您知道資料的資料型別。
所以,為了能夠應對不同的場景,函式將關注點分開。這個函式只關心如何從串列中洗掉一個專案,而不關心它的釋放。相反,它信任其呼叫者進行解除分配,并期望獲得一個假定可以正確處理解除分配的函式。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/335252.html
標籤:C
上一篇:行程已完成,退出代碼為-1073741819(0xC0000005)-C,CLion但輸出沒有任何問題
下一篇:再現C函式的功能
