首先你要搞明白,List本身已經(jīng)被定義為Node*類型,因此List*實(shí)際上是一個(gè)二級指針
成都創(chuàng)新互聯(lián)公司主要從事成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、網(wǎng)頁設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)合肥,十年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):13518219792
你的疑問中,如果改成*list = p-next,運(yùn)行應(yīng)該是可以通過的。但是不推薦這樣做。為什么呢?
這就要先理解FreeMem這個(gè)函數(shù),為什么用List*做參數(shù),而不是List。如果只是為了釋放鏈表內(nèi)存,只要一級指針就可以了,用二級指針只會(huì)增加代碼的復(fù)雜程度,降低可讀性。二級指針的作用就在于,在這個(gè)函數(shù)內(nèi),你可以修改這個(gè)函數(shù)的主調(diào)函數(shù)(比如main函數(shù))中鏈表頭結(jié)點(diǎn)的指針值。在這個(gè)例子中,顯而易見的就是,鏈表釋放了內(nèi)存,head指針應(yīng)該是NULL。
如果上面這段話你能明白的話,那么我的建議是,使用你問題中“可行”的那段代碼,并添加*list = NULL;在結(jié)尾?;蛘哌@樣做也可以達(dá)到同樣的效果:傳入?yún)?shù)使用一級指針,配合函數(shù)的返回值來保證功能的完整性,這樣調(diào)用的時(shí)候需要諸如head = FreeMem(head);以達(dá)到釋放內(nèi)存后置head指針為NULL的目的。
看了樓主的追問,看來樓主對二級指針的理解還不太到位。其實(shí)mornslit兄的解釋已經(jīng)說清楚你這種寫法的問題在哪了。我再幫你分析下:
pt = p-next;
*list = p-next;
這兩種寫法,效果是一樣的,都是保存了下一個(gè)節(jié)點(diǎn)的地址(也就是p-next的值)
list = p-next;
這種寫法,是保存了p這個(gè)節(jié)點(diǎn)的next指針的地址,通過*運(yùn)算,看似可以獲取next的值,其實(shí)在p被free掉之后,next指針本身的值已經(jīng)不能保證了
簡言之,你錯(cuò)在哪了:p-next是下一個(gè)節(jié)點(diǎn)的地址,是與p共存亡的,你可以保存p-next的值,但不應(yīng)該保存它的地址
說實(shí)話,還是建議樓主先搞清楚為什么要用二級指針,殺雞用牛刀未必一定好~
變量用delete釋放,數(shù)組用delete[]釋放,指針的類型不能改變。對于一些簡單的情況(所有成員都是基本數(shù)據(jù)類型,沒有析構(gòu)函數(shù)),可以直接用delete釋放。
例:
structNODE
{
intidata;
doubleddata;
}node[100];
//釋放空間
delete[]node;
//所有的數(shù)組類型釋放空間都這樣寫
擴(kuò)展資料
C語言數(shù)組
數(shù)組的聲明并不是聲明一個(gè)個(gè)單獨(dú)的變量,比如number0、number1、...、number99,而是聲明一個(gè)數(shù)組變量,比如numbers,然后使用numbers[0]、numbers[1]、...、numbers[99]來代表一個(gè)個(gè)單獨(dú)的變量。數(shù)組中的特定元素可以通過索引訪問。
所有的數(shù)組都是由連續(xù)的內(nèi)存位置組成。最低的地址對應(yīng)第一個(gè)元素,最高的地址對應(yīng)最后一個(gè)元素。
一時(shí)看不明白你的代碼。一個(gè)原則是,start指向了誰。如果指向了在這個(gè)函數(shù)中定義的臨時(shí)自動(dòng)型數(shù)組,那必然存在返回局部數(shù)組指針的問題,就是你說的內(nèi)存釋放問題。這樣雖然指針被返回了,但它指向的內(nèi)容已經(jīng)不受代碼控制了,很危險(xiǎn)。但如果start指向的是在主函數(shù)中聲明的數(shù)組,或是全局或靜態(tài)數(shù)組(這個(gè)函數(shù)中定義的靜態(tài)數(shù)組也行),或者是用動(dòng)態(tài)分配法獲得的內(nèi)存空間且未曾釋放,則不存在任何問題,是完全合理合法的。用動(dòng)態(tài)分配法時(shí)要注意在不用時(shí)釋放內(nèi)存空間,以免造成內(nèi)存泄漏。
C管理內(nèi)存大致可以理解為兩種,分配在棧上的,一個(gè)是分配在堆上的。
臨時(shí)變量,動(dòng)態(tài)變量,分配在棧上,運(yùn)行完,直接彈出棧,就沒了。
分配在堆上的內(nèi)存,釋放的時(shí)候,基本上可以理解為,指針不指這里了。也就失去了對這塊內(nèi)存的控制。其實(shí)所謂的釋放。字面意思容易讓人理解錯(cuò)。
有些機(jī)器有些操作系統(tǒng),會(huì)在釋放的時(shí)候清空這段內(nèi)存,但是這種做法效率不高,但是安全,很少有機(jī)器這么做,多數(shù)都是所謂釋放,就是不讓你控制這塊內(nèi)存了而已。