Re: [問題] 關於新手十戒的小問題
看板C_and_CPP (C/C++)作者adrianshum (Alien)時間16年前 (2009/10/31 13:58)推噓7(7推 0噓 10→)留言17則, 7人參與討論串2/3 (看更多)
※ 引述《hn12303158 (2orx)》之銘言:
: 請位各位, 在新手十誡(6)中提到:
: "不可以在函式中回傳一個指向區域性自動變數的指標。否則,會得到垃圾值"
: 但我作了以下的實驗
: 實驗一:
: 定義typedef struct Obj
: Obj* createInstance() {
: Obj* tmp = (Obj*)malloc(sizeof(Obj));
: return tmp;
: }
: 然後在main()裡宣告Obj* obj1 = createInstance()
在 main 裡面的不是 "宣告"
: 這樣雖然函式回傳區域性指標, 但是程式還是運作正常
tmp 指向的東西不是區域性。
你分得出:
Obj* foo() {
Obj myObj;
return &myObj;
}
和
Obj* foo() {
Obj* myObj = (Obj*) malloc(sizeof(Obj));
return myObj;
}
的分別嗎?
前者 return 的 ptr, 指向的是 local 的 variable (在 stack 的),
foo() 完結後,指向的那堆東西就失效了.
後者指向的是從 heap allocate 的。
玩得奸詐一點:
Obj** foo() {
Obj* myObj = (Obj*) malloc(sizeof(Obj));
return &myObj;
}
這樣會出問題嗎?
答案是一樣會,因為回傳的 ptr, 是指向 myObj,
而 myObj 是在 stack.
: 實驗二:
: 定義typedef struct Obj
: void createInstance(Obj* obj) {
: if (obj == NULL) {
: obj = malloc(Obj*)malloc(sizeof(Obj));
: }
: return;
: }
: 然後在main裡宣告Obj* obj = NULL;
: createInstance(obj);
: 實驗二中我用動態配置asign適當大小的記憶體給一個非區域變數,
: 沒有回傳區域變數的指標,
: 程式卻出現core dump(估計是記憶體被回收了)
: 請問這是怎麼回事呢?
: 我原本以為實驗一會失敗, 實驗二會成功,結果卻相反
: 麻煩各位幫忙解惑了, 謝謝!
這個單純是 pass-by-value 的概念。
你傳了 obj 進 function, 然後修改 obj 的
值,當然不會 caller 傳進去的東西。
情況就等如:
void foo(int i) {
i = 10;
}
int myInt = 5;
foo(myInt);
之後myInt 的值是多少?
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 203.218.221.177
推
10/31 17:08, , 1F
10/31 17:08, 1F
→
10/31 17:09, , 2F
10/31 17:09, 2F
→
10/31 17:09, , 3F
10/31 17:09, 3F
→
10/31 17:14, , 4F
10/31 17:14, 4F
→
10/31 17:14, , 5F
10/31 17:14, 5F
→
10/31 17:15, , 6F
10/31 17:15, 6F
推
10/31 17:22, , 7F
10/31 17:22, 7F
推
10/31 17:31, , 8F
10/31 17:31, 8F
→
10/31 17:31, , 9F
10/31 17:31, 9F
→
10/31 17:31, , 10F
10/31 17:31, 10F
推
10/31 18:49, , 11F
10/31 18:49, 11F
→
10/31 18:49, , 12F
10/31 18:49, 12F
推
10/31 18:56, , 13F
10/31 18:56, 13F
推
10/31 21:09, , 14F
10/31 21:09, 14F
→
10/31 21:27, , 15F
10/31 21:27, 15F
→
10/31 21:28, , 16F
10/31 21:28, 16F
推
10/31 21:40, , 17F
10/31 21:40, 17F
討論串 (同標題文章)
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章