[問題] 為什麼我無法free?

看板C_and_CPP (C/C++)作者 (薯)時間16年前 (2009/09/22 23:14), 編輯推噓4(408)
留言12則, 5人參與, 最新討論串1/1
void freeNode(void) { struct node *temp; while ( First != NULL ) { temp = First; First = First->next; free(temp); system("pause"); } while ( sFirst != NULL ) { temp = sFirst; sFirst = sFirst->next; free(temp); } } 這是我要free調我所malloc的函式 可是執行到free(temp); 這行的時候 卻出現錯誤的massagebox 為什麼? 我的用法有錯嗎? 該include 我都有@.@ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.232.47.66 ※ 編輯: liu2007 來自: 118.232.47.66 (09/22 23:14)

09/22 23:18, , 1F
大概是First或sFirst所指的位置不正確
09/22 23:18, 1F

09/22 23:18, , 2F
問題可能出在別的func裡面
09/22 23:18, 2F
附上整個程式碼好了 #include <stdio.h> #include <stdlib.h> #include <time.h> 我的struct struct node{ int number; struct node *next; } *First, *sFirst, *Point, *sPoint, *smallest; //--------------------------------------------------------------------------- 產生節點的副程式: (會順便亂數產生一個1~1000的數字) struct node* makeNode(void) { struct node *NewNode; NewNode = (struct node*)malloc(sizeof(struct node*)); NewNode->number = rand()%1000+1; NewNode->next = NULL; return NewNode; } //-------------------------------------------------------------------------- 主程式: 這個程式主要就是要請使用者輸入一個整數n 然後亂數產生一個有n個 1~1000 的整數鏈結串列 之後做選擇排序 不過由於選擇排序我怎麼弄都弄不好(一個鏈結串列) 只好偷吃步用另一個新的鏈結串列去接最小的數字 (撇開要求不談,選擇排序跟我這種做法有什麼差別嗎?) void main() { int items; srand(time(NULL)); printf("Enter the number of numbers to generate: "); scanf("%d", &items); makeFirstNode(); //建立兩個空節點 makeSortedFirstNode(); makeNumberList( items );  //產生鏈結串列 printNumbers(First); selectionSort(); //排序 printNumbers(sFirst); freeNode(); } //--------------------------------------------------------------------------- 建立空節點: void makeFirstNode(void) { First = makeNode(); First->number = -1; Point = First; } void makeSortedFirstNode(void) { sFirst = makeNode(); sFirst->number = -1; sPoint = sFirst; } //--------------------------------------------------------------------------- 產生n個節點且未排序的列結串列: void makeNumberList(int items) { for (; items > 0; items--) { Point->next = makeNode(); Point = Point->next; } } //----------------------------------------------------------------------- 印出串列內容 void printNumbers(struct node *First) { Point = First->next; while (Point != NULL) { printf("%5d", Point->number); Point = Point->next; } printf("\n"); } //----------------------------------------------------------------------- 排序: First Point ↓ ↓    ◎→口→口→口→口→口→口→口→口→口→口→口→NULL   ↑ smallest sFirst ← (s:Sorted) ↓     ◎→NULL   ↑ sPoint 這是一開始的樣子 因為找到最小的數字後還要叫上一個節點回來 可是我不想用double link  所以只好用Point->next 來當作當下比較的結點 而因為每一次找目前串列中最小數的時候 第一個數都會跟第一個數,也就是自己來做比較 感覺沒什麼意義 所以把每次First 後面第一個點傳給sFirst串列的最後一個 然後Point再從第二個數字跟第一個數字作比較 如果有找到比較小的, Point->next 就換成該Point的點 最後比較完成之後才開始作移動節點的動作 之前的比較只是指來指去而已 並沒有移動 以下為程式碼 void selectionSort(void) { do { smallest = First; Point = First->next; sPoint->next = smallest->next; while ( Point->next != NULL) { if ( Point->next->number < smallest->next->number) smallest = Point; Point = Point->next; } sPoint->next = smallest->next; smallest->next = smallest->next->next; sPoint->next->next = NULL; sPoint = sPoint->next; printNumbers(sFirst); }while ( First->next != NULL); } 這就是整個程式了@.@ 有沒有可以直接貼上 而且可以自動幫我的程式碼上色的網站?? ※ 編輯: liu2007 來自: 118.232.47.66 (09/23 00:01)

09/22 23:27, , 3F
你的First和sFirst是global variable ?
09/22 23:27, 3F

09/22 23:47, , 4F
或者另一種可能, 原來的linked-list有記得把最後一個
09/22 23:47, 4F

09/22 23:48, , 5F
node的next設成NULL嗎?? 有沒有可能list衝過頭了@_@"
09/22 23:48, 5F
※ 編輯: liu2007 來自: 118.232.47.66 (09/23 00:02) ※ 編輯: liu2007 來自: 118.232.47.66 (09/23 00:03)

09/23 00:03, , 6F
置底文...#18aqD7zb
09/23 00:03, 6F
※ 編輯: liu2007 來自: 118.232.47.66 (09/23 00:04)

09/23 00:05, , 7F
makeNode第二行 NewNode = ... sizeof(struct node*));
09/23 00:05, 7F

09/23 00:07, , 8F
你看到問題了嗎? ^^^^^^^^^^^^
09/23 00:07, 8F

09/23 00:08, , 9F
我也想要有massagebox XD
09/23 00:08, 9F

09/23 00:10, , 10F
哈哈
09/23 00:10, 10F

09/23 00:27, , 11F
解決了 感謝 又是小地方Orz.....
09/23 00:27, 11F

09/23 00:34, , 12F
馬殺雞小盒子
09/23 00:34, 12F
文章代碼(AID): #1AkEdAHV (C_and_CPP)
文章代碼(AID): #1AkEdAHV (C_and_CPP)