看板 C_and_CPP 關於我們 聯絡資訊
(原文恕刪) 謝謝各位老前輩的指點,我想「謝謝」二個字誠意太少,回個文章,把自己懂的 內容再度整理出來,讓後來爬文的同好不要再犯,也順便當做對於有心指點的前 輩一點小小的回饋,不成敬意: 傳址呼叫有 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
ledia:推一下你的整理 02/10 15:19
james732:就像退租房子之後,通常裡面的東西會被房東清掉或弄亂 XD 02/10 15:43
james732:VC Debug會變成0xDDDDDDDD,VC Release會變成亂數值 02/10 15:44
james732:會變成0應該是gcc 02/10 15:44
uranusjr:其實關鍵在於「傳址呼叫」到底是什麼鬼, 地址本身也是值, 02/10 15:52
uranusjr:就只是傳值的一種, 為什麼要給個名稱讓人以為兩者不一樣 02/10 15:53
loveme00835:原來 VC 也會 XD, 0.0 02/10 16:08
abzxcx:看了後,我又長了知識,但我想問如果free了之後,再去存取 02/10 16:26
abzxcx:,萬一存取到那支程式不該存取的地方,OS會擋嗎? 02/10 16:26
abzxcx:擋的話就是所謂的 run time error !? 02/10 16:26
Bencrie:就是 Segmentation fault ... Win應該是程式執行作業無效 02/10 16:58
lions0164:好奇怪 我在工作站上打上這Code 印出來都是1234 1234.. 02/10 18:39
lions0164:但是複製到CODEBLOCKS 就有free了.. 02/10 18:39
nowar100:你還是誤會了 有沒有free 和 值是不是0 沒有關係 02/10 18:52
fcouple:好厲害,我的確是用gcc。回覆問「存取到不合法位址」的網 02/10 21:16
fcouple:友,會造成Segmentation fault至於 MS 的 Window 就要看用 02/10 21:17
fcouple:什麼 compiler 吧(win不太熟) 02/10 21:17
lausai:這篇觀念還是不對吧= = free後該記憶體的值可以是任意值 02/10 22:19
lausai:還有 傳址呼叫這種詞只會讓人混淆 切記C語言"只有"傳值呼叫 02/10 22:23