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