Re: [問題] 鏈結串列用malloc配置記憶體
: → 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,
05/03 05:05
→
05/03 05:06,
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
05/03 15:55, 2F
→
05/03 15:57, , 3F
05/03 15:57, 3F
→
05/03 15:59, , 4F
05/03 15:59, 4F
當空間已經被記憶體回收後
你再存取的話會出錯(例如最後一張圖的 tail)
並不會自動指向NULL
你必須手動加 (tail = NULL;)
→
05/03 16:14, , 5F
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
05/04 02:30, 9F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):