[問題] free 指令一問

看板C_and_CPP (C/C++)作者 (人生啊…)時間15年前 (2011/02/09 23:32), 編輯推噓4(4014)
留言18則, 8人參與, 最新討論串1/2 (看更多)
各位版友,新年快樂,小弟有個問題想請教: 底下先說說我對 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

02/09 23:36, , 1F
還回去不代表你碰不到 你操作他是未定義行為
02/09 23:36, 1F

02/09 23:36, , 2F
設成NULL只是為了避免兩次free
02/09 23:36, 2F

02/09 23:37, , 3F
free裡面大概長這樣 if (p!=NULL) ...;
02/09 23:37, 3F

02/09 23:39, , 4F
你NULL的是STACK的值唷XD
02/09 23:39, 4F

02/09 23:47, , 5F
free的意思有點類似租房子跟房東解約
02/09 23:47, 5F

02/09 23:48, , 6F
解約後你當然還是知道房子在哪 想要偷偷住也是做得到
02/09 23:48, 6F

02/09 23:49, , 7F
至於房東會不會生氣就是另外一回事了...XDDD
02/09 23:49, 7F

02/09 23:52, , 8F
後面的問題,跟這個差不多 http://ppt.cc/m8e2
02/09 23:52, 8F

02/10 00:02, , 9F
你的程式修改如此:http://nopaste.info/a91e26a599.html
02/10 00:02, 9F

02/10 00:02, , 10F
不知道為什麼 \n 會自己變成 n...
02/10 00:02, 10F

02/10 00:25, , 11F
樓上比喻真是太妙了
02/10 00:25, 11F

02/10 01:43, , 12F
james732 正解。 main 的 ast 跟 delst 的 ast 不是同一個
02/10 01:43, 12F

02/10 13:39, , 13F
租房子的比喻很棒XD
02/10 13:39, 13F

02/10 13:46, , 14F
疑? 我怎麼記得這個比喻之前有出現過 @_@
02/10 13:46, 14F

02/10 14:22, , 15F
真的嗎?這個比喻是我昨天心血來潮想到的 XDDD
02/10 14:22, 15F

02/10 14:55, , 16F
我記得之前這比喻也是你想的...XD
02/10 14:55, 16F

02/10 15:33, , 17F
我老了嗎 完全不記得這回事 XDDDD
02/10 15:33, 17F

02/11 00:11, , 18F
j大莫非美國牛肉吃多了XD
02/11 00:11, 18F
文章代碼(AID): #1DKhEJMu (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1DKhEJMu (C_and_CPP)