Re: [問題] free 指令一問

看板C_and_CPP作者 (人生啊…)時間15年前 (2011/02/10 14:55), 編輯推噓8(8011)
留言19則, 10人參與, 最新討論串2/2 (看更多)
(原文恕刪) 謝謝各位老前輩的指點,我想「謝謝」二個字誠意太少,回個文章,把自己懂的 內容再度整理出來,讓後來爬文的同好不要再犯,也順便當做對於有心指點的前 輩一點小小的回饋,不成敬意: 傳址呼叫有 side effect 這是人人皆知,老手常常用 swap 這種例子來教新手 ,這個我也懂。 我的問題就出在,「我以為傳進去的東西是個位址」所以「一定就是傳址呼叫」 ,誰知道我在做的「還是傳值呼叫」,所以造成裡面 free 了以後,在外面又 能讀到值,而我又懷疑錯是 free() 有問題,讓 bug 遲遲未找到。 事實上 free() 指令不像我前文說的那樣,我用下面的程式碼來做解釋: #include <stdio.h> #include <stdlib.h> int main() { int *ptri; ptri = (int *)malloc(sizeof(int)); *ptri = 1234; printf("%d\n", *ptri); free( ptri ); printf("%d\n", *ptri); //不合法存取,危險 return 0; } 執行結果 1234 0 可以清楚看到,free 了以後,你印不出它原來的值。 但這裡也發現 free 後,再去讀值,compiler 時沒給錯,執行時期 也沒給錯,這是程式設計師自己要注意的。 當然,最後還是一聲謝謝。 最後,聲明一下,這不是我的「工作文」也不是「作業文」,所以請放心 ,是我無聊寫程式罷了。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 211.76.74.145

02/10 15:19, , 1F
推一下你的整理
02/10 15:19, 1F

02/10 15:43, , 2F
就像退租房子之後,通常裡面的東西會被房東清掉或弄亂 XD
02/10 15:43, 2F

02/10 15:44, , 3F
VC Debug會變成0xDDDDDDDD,VC Release會變成亂數值
02/10 15:44, 3F

02/10 15:44, , 4F
會變成0應該是gcc
02/10 15:44, 4F

02/10 15:52, , 5F
其實關鍵在於「傳址呼叫」到底是什麼鬼, 地址本身也是值,
02/10 15:52, 5F

02/10 15:53, , 6F
就只是傳值的一種, 為什麼要給個名稱讓人以為兩者不一樣
02/10 15:53, 6F

02/10 16:08, , 7F
原來 VC 也會 XD, 0.0
02/10 16:08, 7F

02/10 16:26, , 8F
看了後,我又長了知識,但我想問如果free了之後,再去存取
02/10 16:26, 8F

02/10 16:26, , 9F
,萬一存取到那支程式不該存取的地方,OS會擋嗎?
02/10 16:26, 9F

02/10 16:26, , 10F
擋的話就是所謂的 run time error !?
02/10 16:26, 10F

02/10 16:58, , 11F
就是 Segmentation fault ... Win應該是程式執行作業無效
02/10 16:58, 11F

02/10 18:39, , 12F
好奇怪 我在工作站上打上這Code 印出來都是1234 1234..
02/10 18:39, 12F

02/10 18:39, , 13F
但是複製到CODEBLOCKS 就有free了..
02/10 18:39, 13F

02/10 18:52, , 14F
你還是誤會了 有沒有free 和 值是不是0 沒有關係
02/10 18:52, 14F

02/10 21:16, , 15F
好厲害,我的確是用gcc。回覆問「存取到不合法位址」的網
02/10 21:16, 15F

02/10 21:17, , 16F
友,會造成Segmentation fault至於 MS 的 Window 就要看用
02/10 21:17, 16F

02/10 21:17, , 17F
什麼 compiler 吧(win不太熟)
02/10 21:17, 17F

02/10 22:19, , 18F
這篇觀念還是不對吧= = free後該記憶體的值可以是任意值
02/10 22:19, 18F

02/10 22:23, , 19F
還有 傳址呼叫這種詞只會讓人混淆 切記C語言"只有"傳值呼叫
02/10 22:23, 19F
文章代碼(AID): #1DKulKud (C_and_CPP)
文章代碼(AID): #1DKulKud (C_and_CPP)