[問題] 關於新手十戒的小問題

看板C_and_CPP (C/C++)作者 (2orx)時間16年前 (2009/10/31 12:33), 編輯推噓5(507)
留言12則, 4人參與, 最新討論串1/3 (看更多)
請位各位, 在新手十誡(6)中提到: "不可以在函式中回傳一個指向區域性自動變數的指標。否則,會得到垃圾值" 但我作了以下的實驗 實驗一: 定義typedef struct Obj Obj* createInstance() { Obj* tmp = (Obj*)malloc(sizeof(Obj)); return tmp; } 然後在main()裡宣告Obj* obj1 = createInstance() 這樣雖然函式回傳區域性指標, 但是程式還是運作正常 實驗二: 定義typedef struct Obj void createInstance(Obj* obj) { if (obj == NULL) { obj = (Obj*)malloc(sizeof(Obj)); } return; } 然後在main裡宣告Obj* obj = NULL; createInstance(obj); 實驗二中我用動態配置asign適當大小的記憶體給一個非區域變數, 沒有回傳區域變數的指標, 程式卻出現core dump(估計是記憶體被回收了) 請問這是怎麼回事呢? 我原本以為實驗一會失敗, 實驗二會成功,結果卻相反 麻煩各位幫忙解惑了, 謝謝! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 122.116.39.129

10/31 12:38, , 1F
區域性"自動變數" malloc來的不是長在stack上的自動變數
10/31 12:38, 1F

10/31 12:46, , 2F
實驗1用了malloc產生的東西不是自動變數,但tmp是自動
10/31 12:46, 2F

10/31 12:46, , 3F
變數,你傳回的是tmp存的值,而非其本身
10/31 12:46, 3F

10/31 12:50, , 4F
實驗2你在寫什麼鬼呢,你確定這是正常程式碼
10/31 12:50, 4F

10/31 12:52, , 5F
func.obj->main.obj, func.obj->malloc..!=main.obj->m..
10/31 12:52, 5F

10/31 12:58, , 6F
實驗2我只是單純的想把記憶體配置放到function裡去作
10/31 12:58, 6F

10/31 12:58, , 7F
另外twot大你的回答是什麼意思呢?我不大能理解
10/31 12:58, 7F

10/31 12:59, , 8F
不過現在我知道實驗1的癥結所在了
10/31 12:59, 8F

10/31 13:00, , 9F
malloc出來的不是自動變數, 而且存在於heap而非stack
10/31 13:00, 9F

10/31 13:38, , 10F
malloc(Obj*)malloc(sizeof(Obj)); 我是說這裡在寫啥
10/31 13:38, 10F

10/31 13:38, , 11F
跟你的實驗1比,你多打一個malloc幹嘛
10/31 13:38, 11F

10/31 17:04, , 12F
阿 那是手殘打錯了 抱歉
10/31 17:04, 12F
※ 編輯: hn12303158 來自: 122.116.39.129 (10/31 17:13)
文章代碼(AID): #1AwxugTb (C_and_CPP)
文章代碼(AID): #1AwxugTb (C_and_CPP)