[問題] pop stack的一個問題

看板C_and_CPP (C/C++)作者 (砝碼)時間13年前 (2012/10/23 22:27), 編輯推噓2(2018)
留言20則, 3人參與, 最新討論串1/1
想請問一個問題 現在我想用linked list寫一個pop struc node { int data; struct node *next; } typedef struct node *nodepointer; void pop(nodepointer root) { if (root->next==NULL) printf("No element to pop\n"); else { nodepointer temp; temp=(nodepointer)malloc(sizeof(nodepointer)); temp=root->next; root->next=temp->next; free(temp); } 想問的是 我為何不行改成這樣 else { root->next=NULL; } 直接把root之後的東西砍掉 達成pop的效果 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.218.97

10/23 22:39, , 1F
能不能再說一遍你想做什麼?
10/23 22:39, 1F

10/23 22:41, , 2F
你造成了 memory leak
10/23 22:41, 2F

10/23 22:42, , 3F
對你的程式來說是砍掉了 但對 OS 來說還以為你的程式還在用
10/23 22:42, 3F
喔喔 是因為我沒有釋放掉被推出來的那個list嗎?

10/23 22:43, , 4F
順帶一提 你原來的 temp=(nodepointer)malloc(..) 那行也是
10/23 22:43, 4F

10/23 22:43, , 5F
在刪除的時候不必要再去要一個節點出來
10/23 22:43, 5F
可是這樣要怎麼知道我要刪除哪個 free(root->next) 這樣有辦法嗎? ※ 編輯: famayo 來自: 140.112.218.97 (10/23 22:46)

10/23 22:52, , 6F
temp = root->next 已經確實的把你要 free 的節點給記住了
10/23 22:52, 6F

10/23 22:52, , 7F
10/23 22:52, 7F

10/23 22:52, , 8F
所以在那之後 free(temp) 正確的釋放了那個空間
10/23 22:52, 8F

10/23 22:53, , 9F
你一定把指標跟指標指向的物件給弄混了才會有這個問題
10/23 22:53, 9F

10/23 22:56, , 10F
你應該是要砍 root,而不是砍 root 後面的那串。
10/23 22:56, 10F

10/23 22:57, , 11F
並且你原本的寫法並不能達成任何事情。
10/23 22:57, 11F

10/23 22:57, , 12F
你的 root 相當於是堆疊的最上層。
10/23 22:57, 12F
上面那個寫法是在砍root之上的那個list不是嗎? root一開始就確定他的next不只向NULL了 所以他肯定不會上最上層不是嗎@@? ※ 編輯: famayo 來自: 140.112.218.97 (10/23 23:00)

10/23 23:04, , 13F
我之前的說法有誤,你的程式碼中 root->next 才是最上層
10/23 23:04, 13F

10/23 23:10, , 14F
並且你原本的寫法會造成 memory leak。
10/23 23:10, 14F

10/23 23:14, , 15F
你說上面那個嗎?
10/23 23:14, 15F

10/23 23:15, , 16F
是的。
10/23 23:15, 16F

10/23 23:16, , 17F
因為你配置了一塊記憶體並存在 temp,又把 temp 蓋掉。
10/23 23:16, 17F

10/23 23:17, , 18F
等於這塊記憶體沒被用到,而且變成孤兒。
10/23 23:17, 18F

10/23 23:22, , 19F
root->最上層->...->最下層->(NULL)
10/23 23:22, 19F

10/23 23:22, , 20F
你的 stack 應該是長這樣
10/23 23:22, 20F
文章代碼(AID): #1GXgbUUc (C_and_CPP)
文章代碼(AID): #1GXgbUUc (C_and_CPP)