Re: [問題] free 指令一問
(原文恕刪)
謝謝各位老前輩的指點,我想「謝謝」二個字誠意太少,回個文章,把自己懂的
內容再度整理出來,讓後來爬文的同好不要再犯,也順便當做對於有心指點的前
輩一點小小的回饋,不成敬意:
傳址呼叫有 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
02/10 15:43, 2F
→
02/10 15:44, , 3F
02/10 15:44, 3F
→
02/10 15:44, , 4F
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
02/10 16:08, 7F
推
02/10 16:26, , 8F
02/10 16:26, 8F
→
02/10 16:26, , 9F
02/10 16:26, 9F
→
02/10 16:26, , 10F
02/10 16:26, 10F
推
02/10 16:58, , 11F
02/10 16:58, 11F
→
02/10 18:39, , 12F
02/10 18:39, 12F
→
02/10 18:39, , 13F
02/10 18:39, 13F
推
02/10 18:52, , 14F
02/10 18:52, 14F
→
02/10 21:16, , 15F
02/10 21:16, 15F
→
02/10 21:17, , 16F
02/10 21:17, 16F
→
02/10 21:17, , 17F
02/10 21:17, 17F
推
02/10 22:19, , 18F
02/10 22:19, 18F
推
02/10 22:23, , 19F
02/10 22:23, 19F
討論串 (同標題文章)