Re: [問題] 鏈結串列用malloc配置記憶體

看板C_and_CPP作者 (世界)時間12年前 (2012/05/03 12:57), 編輯推噓3(306)
留言9則, 4人參與, 最新討論串2/2 (看更多)
: → a80885057:我想問一個問題,為什麼我有時候要宣告這串 05/02 23:39 : → a80885057:lnode *head, *tail,*p; 05/02 23:40 : → a80885057:有時候都會編譯錯誤 05/02 23:40 struct lnode *head, *tail,*p; : 我不用p是因為我還不太懂p的操作方式 = =" : 直覺就用head : : do{ : p = head->next; : free(head); : head = p; : }while(p != NULL); : 這段我不太懂 : p= head -> next; : 是表達p指到next嗎?? : 還有為什麼要用do-while 為了省code : 我聽助教說free表示其他東西可以用這個區塊 : 但沒有東西要用此區塊的話 : 裡面的資料不會改變 資料的確不會變沒錯 但是如果程式一大 這邊要一塊記憶體,那邊要一塊 都不做free的動作 你的程式吃的記憶體只會愈長愈大 再多的記憶體都不夠用 所以請保持好習慣 當你要來的記憶體不用的時候請做free : 這樣不會變成無線迴圈嗎?? : 因為p!=NULL 今天假設你的鍊結串列已經串好了 我用h代表head,t代表tail 下面圖解說明 h t ↓ ↓ █→█→█→█→█→█→NULL 以下一行一行執行迴圈 1. do{ p = head->next; free(head); head = p; }while(p != NULL); h p t ↓ ↓ ↓ █→█→█→█→█→█→NULL 2. do{ p = head->next; free(head); head = p; }while(p != NULL); h p t ↓ ↓ ↓ ╳→█→█→█→█→█→NULL 3. do{ p = head->next; free(head); head = p; }while(p != NULL); h p t ↘↓ ↓ ╳ █→█→█→█→█→NULL 4. do{ p = head->next; free(head); head = p; }while(p != NULL); h p t ↘↓ ↓ ╳ █→█→█→█→█→NULL 5. do{ p = head->next; free(head); head = p; }while(p != NULL); h p t ↘ ↓ ↓ ╳ █→█→█→█→█→NULL . . . 中略 最後一圈會變成 Last 1 do{ p = head->next; free(head); head = p; }while(p != NULL); h t p ↘↓ ↓ ╳ ╳ ╳ ╳ ╳ █→NULL Last 2 do{ p = head->next; free(head); head = p; }while(p != NULL); h t p ↘↓ ↓ ╳ ╳ ╳ ╳ ╳ ╳ NULL Last 3 do{ p = head->next; free(head); head = p; }while(p != NULL); t h p ↓ ↘↓ ╳ ╳ ╳ ╳ ╳ ╳ NULL Last 4 do{ p = head->next; free(head); head = p; }while(p != NULL); t h p ↓ ↘↓ ╳ ╳ ╳ ╳ ╳ ╳ NULL 迴圈中斷

05/03 05:05,
用 do-while 的話,在 head == NULL 的情況下
05/03 05:05

05/03 05:06,
會造成 access violation
05/03 05:06
正如linotwo所說,再加一行判斷是比較保險的做法 if( head != NULL ){ do{ p = head->next; free(head); head = p; }while(p != NULL); } -- ※ 發信站: 批踢踢實業坊(ptt.cc)

05/03 15:54, , 1F
可是我經常看到助教直接寫
05/03 15:54, 1F

05/03 15:55, , 2F
knife * pj 都不加struct
05/03 15:55, 2F

05/03 15:57, , 3F
手機怪怪的,是lnode * p
05/03 15:57, 3F

05/03 15:59, , 4F
還有如果此空間沒被佔用電腦就會把他定義成NULL嗎?
05/03 15:59, 4F
當空間已經被記憶體回收後 你再存取的話會出錯(例如最後一張圖的 tail) 並不會自動指向NULL 你必須手動加 (tail = NULL;)

05/03 16:14, , 5F
我剛剛加了struct 結果換malloc那行不能編譯
05/03 16:14, 5F
麻煩你再貼一次程式碼吧

05/03 16:24, , 6F
05/03 16:24, 6F
※ 編輯: syuasdio 來自: 1.162.154.188 (05/03 22:53)

05/03 23:32, , 7F
怪了,我下午弄時候還不能編譯,現在就可以了 = =
05/03 23:32, 7F

05/03 23:54, , 8F
推圖解:)
05/03 23:54, 8F

05/04 02:30, , 9F
大推圖解:P
05/04 02:30, 9F
文章代碼(AID): #1FeX0xba (C_and_CPP)
文章代碼(AID): #1FeX0xba (C_and_CPP)