看板 C_and_CPP 關於我們 聯絡資訊
各位版友,新年快樂,小弟有個問題想請教: 底下先說說我對 free() 的認知,若有誤請前輩指正: 書上告訴我們 free() 可以把配置的記憶體收回, 給我們系統自動幫我們把指標也一併做後續處理的錯覺。 但我爬文的結果卻是 free() 只是告訴系統該記憶體不使用。 只有「告訴」系統而已,我測試: free( ptr ); printf("%d", ptr->someone); //someone 是一個int free後,甚至還是可以印出它的值。 所以我們在free後還要自己擦屁股: free( ptr ); ptr = NULL; 設定成 NULL 這裡我不確定,有誤請指正。 以上是我對 free() 的認知,底下是要問的問題: #include <stdio.h> #include <stdlib.h> typedef struct myst { int x; long y; unsigned char *arry; } myst; void delst(myst *ast) { free( ast->arry ); ast->arry = NULL; printf("delst 之前 %p\n", ast); free( ast ); ast = NULL; printf("delst 之後 %p\n", ast); } int main() { printf("%d\n", sizeof(myst)); myst *ast = (myst *)malloc( sizeof(myst) ); ast->arry = (unsigned char *)malloc( sizeof(unsigned char)*5 ); printf("main 之前 %p\n", ast); delst( ast ); printf("main 之後 %p\n", ast); printf("執行 delst 之後 arry 的內容 %p\n", ast->arry); return 0; } 註:printf是在debug所以我往前縮一。 我的用意,是要用一個 delst() 來處理 free 的種種細項動作,讓程式簡潔。 但執行結果卻不如預期(底下是上面程式的執行結果): 12 main 之前 003E4848 delst 之前 003E4848 delst 之後 00000000 main 之後 003E4848 <-- 我覺得它有問題,不是應該要 00000000 才對嗎? 執行 delst 之後 arry 的內容 00000000 我要問的是,為何 「main 之後 003E4848」 而不是 「main 之後 00000000」 ,換句話說就是呼叫副程式幫我 free 了以後,回到了 main 中怎麼記憶體位址 又回來了? 不是應該要是 NULL 才對嗎? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 211.76.74.145
nowar100:還回去不代表你碰不到 你操作他是未定義行為 02/09 23:36
nowar100:設成NULL只是為了避免兩次free 02/09 23:36
nowar100:free裡面大概長這樣 if (p!=NULL) ...; 02/09 23:37
stupid0319:你NULL的是STACK的值唷XD 02/09 23:39
james732:free的意思有點類似租房子跟房東解約 02/09 23:47
james732:解約後你當然還是知道房子在哪 想要偷偷住也是做得到 02/09 23:48
james732:至於房東會不會生氣就是另外一回事了...XDDD 02/09 23:49
james732:後面的問題,跟這個差不多 http://ppt.cc/m8e2 02/09 23:52
james732:你的程式修改如此:http://nopaste.info/a91e26a599.html 02/10 00:02
james732:不知道為什麼 \n 會自己變成 n... 02/10 00:02
tropical72:樓上比喻真是太妙了 02/10 00:25
Neo1978:james732 正解。 main 的 ast 跟 delst 的 ast 不是同一個 02/10 01:43
uranusjr:租房子的比喻很棒XD 02/10 13:39
loveme00835:疑? 我怎麼記得這個比喻之前有出現過 @_@ 02/10 13:46
james732:真的嗎?這個比喻是我昨天心血來潮想到的 XDDD 02/10 14:22
loveme00835:我記得之前這比喻也是你想的...XD 02/10 14:55
james732:我老了嗎 完全不記得這回事 XDDDD 02/10 15:33
VictorTom:j大莫非美國牛肉吃多了XD 02/11 00:11