[問題] 記憶體配置的問題

看板C_and_CPP作者 (阿三)時間16年前 (2009/12/16 17:28), 編輯推噓4(4016)
留言20則, 7人參與, 最新討論串1/1
void getMemory(char* p, int num) {   p = (char*)malloc(sizeof(char)*num); } void main() {   char* str = NULL;   getMemory(str, 100);   strcpy(str, "Hello"); } 遇到一題這樣的除錯問題 compile沒有問題 但是執行時會因為發生錯誤而關閉程式 看了很久 看不出問題在哪 囧" -- 大眼睛芊芊 http://www.wretch.cc/album/album.php?id=dbshadow&book=3 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 120.125.85.173

12/16 17:31, , 1F
call by value的問題, 設中斷點在strcpy那行, 你會發現
12/16 17:31, 1F

12/16 17:32, , 2F
那時的str還是NULL.
12/16 17:32, 2F

12/16 17:33, , 3F
解決方法, getMemory吃char **, 並在main傳入&str, 當然
12/16 17:33, 3F

12/16 17:33, , 4F
function要做相應的修改;
12/16 17:33, 4F

12/16 17:33, , 5F
方法二, p讓getMemory return回來讓str收.
12/16 17:33, 5F

12/16 18:14, , 6F
請為為什麼多了=NULL程式就錯,沒有=NULL就可以RUN了呢~
12/16 18:14, 6F

12/16 18:16, , 7F
沒有 NULL 可以 run 只是運氣好而已
12/16 18:16, 7F

12/16 18:16, , 8F
而且會發生無法預期的錯誤
12/16 18:16, 8F

12/16 21:39, , 9F
動態記憶體配置=>有借,就要有還。
12/16 21:39, 9F

12/16 21:41, , 10F
malloc 或是 calloc 是向作業系統「借一塊記憶體」
12/16 21:41, 10F

12/16 21:42, , 11F
主程式結束前,要把借來的記憶體「還給作業系統」
12/16 21:42, 11F

12/16 21:43, , 12F
所以要加上 free(str) 在主程式的末端。
12/16 21:43, 12F

12/16 21:46, , 13F
為什麼要有借有還?因為作業系統掌控電腦資源(含記憶體)
12/16 21:46, 13F

12/17 02:02, , 14F
anyway, V大正解
12/17 02:02, 14F

12/17 06:41, , 15F
johnhmj大似乎弄錯重點了orz...
12/17 06:41, 15F

12/17 06:42, , 16F
雖然改完這個錯,記得free是比較好啦
12/17 06:42, 16F

12/17 16:18, , 17F
OS一般來說程式結束會自己幫你收
12/17 16:18, 17F

12/17 18:42, , 18F
>_<!是我搞錯重點了…改成 getMemory(char* &p, 就好了
12/17 18:42, 18F

12/17 18:43, , 19F
取它參照,外部變數就會跟著設址。
12/17 18:43, 19F

12/17 18:43, , 20F
…昏倒在鋼琴上了。
12/17 18:43, 20F
文章代碼(AID): #1BAAWj0p (C_and_CPP)