標籤:
BUG:今天我寫了一個很SB的代碼,這個問題其實我早己注意到,在以前寫這樣的代碼的時候,我也留了個心眼,但可能是很長時間不寫這些東西導致新問題的產生。其實這個問題我以前也寫過筆記,現在再寫一下加深印象。先附代碼:
#ifndef LIST_INSERTREMOVEPRINT_H#define LIST_INSERTREMOVEPRINT_H#include<iostream>struct ListNode{int val; struct ListNode *nxt;}; void addListNode(struct ListNode*list,int value){struct ListNode *nodeInsert=(struct ListNode*)(malloc(sizeof(struct ListNode))); nodeInsert->val=value; nodeInsert->nxt=NULL; if(list==NULL){list=nodeInsert;return ; }struct ListNode *iter=list; while(iter->nxt!=NULL){iter=iter->nxt; }iter->nxt=nodeInsert;}#end
其實熟悉的人一看就知道問題出在哪了!!!!!高亮部分就說明了這個問題。犯這個錯誤的原因在於對指標的傳遞不太明白。
void addListNode(struct ListNode*list,int value)
在這個函數中有兩個形參,一個是鏈表節點的指標類型,別一個是int 型囉。對於這個鏈表節點指標,我們傳入的是什麼呢?當然,傳入的是一個地址嘛,因為它是指標。嗯,我們是如何傳遞這個指標的呢,傳值嘛!!!!!!!。你傳遞地址還是傳值啊,只是這個值是”地址“而己嘛。既然明白這點,那麼問題來了,你在函數體內改這
list=nodeInsert
你這個是什麼意思啊?,,,把這個nodeInsert地址付值給list ?也就是你有這麼個函數
void test(int a,int value){ int c; a=c; }
你這是什麼意思? 你還真想通過在函數體內的a=c 來改變實參值嗎? 滾你媽的。
iter->nxt=nodeInsert;
這個就更扯蛋了,你還是在改變形參中的值,這個肯定不行啦。
如何解決這個BUG 1, 如果要通過形參改變實參,對於這個地址的傳值問題,可以通過 "*" -----解引用運算子。
也就是我們通過這個解引用這個形參,這樣找到形參地址對應的空間,在記憶體裡面改變這個實三的值。 2,傳入指標的指標,再用解引用運算子。 反正得解引用才能通過形參改實參!!!!!!
來自為知筆記(Wiz)
鏈表的插入問題