看板 C_and_CPP 關於我們 聯絡資訊
請位各位, 在新手十誡(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
nowar100:區域性"自動變數" malloc來的不是長在stack上的自動變數 10/31 12:38
twotwoone:實驗1用了malloc產生的東西不是自動變數,但tmp是自動 10/31 12:46
twotwoone:變數,你傳回的是tmp存的值,而非其本身 10/31 12:46
twotwoone:實驗2你在寫什麼鬼呢,你確定這是正常程式碼 10/31 12:50
snowlike:func.obj->main.obj, func.obj->malloc..!=main.obj->m.. 10/31 12:52
hn12303158:實驗2我只是單純的想把記憶體配置放到function裡去作 10/31 12:58
hn12303158:另外twot大你的回答是什麼意思呢?我不大能理解 10/31 12:58
hn12303158:不過現在我知道實驗1的癥結所在了 10/31 12:59
hn12303158:malloc出來的不是自動變數, 而且存在於heap而非stack 10/31 13:00
twotwoone:malloc(Obj*)malloc(sizeof(Obj)); 我是說這裡在寫啥 10/31 13:38
twotwoone:跟你的實驗1比,你多打一個malloc幹嘛 10/31 13:38
hn12303158:阿 那是手殘打錯了 抱歉 10/31 17:04
※ 編輯: hn12303158 來自: 122.116.39.129 (10/31 17:13)