1、這可能跟你的那幾個(gè)strncpy的使用方式有關(guān)。我查了一下這個(gè)函數(shù)的手冊(cè),大致是這么說。這個(gè)函數(shù)在源比size大時(shí),copy size個(gè)字符,不包括null。
目前創(chuàng)新互聯(lián)建站已為成百上千的企業(yè)提供了網(wǎng)站建設(shè)、域名、雅安服務(wù)器托管、網(wǎng)站運(yùn)營、企業(yè)網(wǎng)站設(shè)計(jì)、微山網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
2、可以釋放,但是p依然還是指向該內(nèi)存的地址,因此,p-next=null;也會(huì)把p-next指向的數(shù)據(jù)修改。
3、程序:定義指針head2 head2 = head - next free(head)head = head2 這樣就行了,原來的程序肯定是錯(cuò)誤的,head被free以后再去訪問的話會(huì)出現(xiàn)內(nèi)存訪問錯(cuò)誤,在Windows下會(huì)引起程序被強(qiáng)制結(jié)束。
4、如果LinkList是一個(gè)結(jié)構(gòu)體類型,而不是指針類型,那么s=L 這樣的語句就是徹底錯(cuò)誤的,要知道void ListFree(LinkList L),這里的L是局部變量,進(jìn)入函數(shù)時(shí)從堆棧中得到的,而不是你malloc出來的。
5、這段代碼釋放了整個(gè)鏈表空間內(nèi)存;while循環(huán)的作用是從頭到尾釋放后續(xù)結(jié)點(diǎn),如果直接free(pHead)則后面的結(jié)點(diǎn)將無法找到,那么造成內(nèi)存空間泄露。
6、你的疑問中,如果改成*list = p-next,運(yùn)行應(yīng)該是可以通過的。但是不推薦這樣做。為什么呢?這就要先理解FreeMem這個(gè)函數(shù),為什么用List*做參數(shù),而不是List。
free(p); p=p-next;還有這樣寫的嗎?p指向的結(jié)點(diǎn)已經(jīng)釋放了,哪兒來的p-next?所以,問題不在free而在找不到p-next了。
可以釋放,但是p依然還是指向該內(nèi)存的地址,因此,p-next=null;也會(huì)把p-next指向的數(shù)據(jù)修改。
))個(gè)內(nèi)存空間,你在循環(huán)那里使用它每循環(huán)一次他里面的空間就減少,如果循環(huán)三次空間就滿了你設(shè)定四次循環(huán)它內(nèi)存不就溢出了?free函數(shù)正是這個(gè)時(shí)候使用的只要在循環(huán)里使用free他就會(huì)釋放內(nèi)存,然后內(nèi)存就恢復(fù)原始狀態(tài)了。
你的list僅僅是一個(gè)鏈表元素,你的程序里,它并不是動(dòng)態(tài)生成的,而是一個(gè)局部變量,這時(shí)候你去free釋放它,就會(huì)報(bào)錯(cuò)。修改很簡單,把創(chuàng)建函數(shù)參數(shù)改成指向指針的指針。
1、free(p); p=p-next;還有這樣寫的嗎?p指向的結(jié)點(diǎn)已經(jīng)釋放了,哪兒來的p-next?所以,問題不在free而在找不到p-next了。
2、這個(gè)錯(cuò)誤雖然在free時(shí)報(bào)錯(cuò),但是錯(cuò)誤不是free導(dǎo)致的。(C_pt + sizeof(int)) = 2;這里你在訪問C_pt指向的內(nèi)存的第5個(gè)int,而你只分配了4個(gè)int的內(nèi)存,因此你的代碼出現(xiàn)內(nèi)存訪問越界,當(dāng)然有問題。
3、這可能跟你的那幾個(gè)strncpy的使用方式有關(guān)。我查了一下這個(gè)函數(shù)的手冊(cè),大致是這么說。這個(gè)函數(shù)在源比size大時(shí),copy size個(gè)字符,不包括null。