[問題] 函數的回傳值

看板C_and_CPP (C/C++)作者 (nahgnimiast)時間16年前 (2009/06/19 01:56), 編輯推噓3(309)
留言12則, 5人參與, 最新討論串1/1
環境vs2005 我看到有類似下面的程式碼,回傳區域的結構變數, 跑起來也沒問題,但這寫法事實上到底正不正確? typedef struct AAA { int a; int b; } StructAAA; StructAAA fun(void) { StructAAA a; a.a =1; a.b =2; return a; } void main() { StructAAA b; b = fun(); } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.229.141.172

06/19 02:07, , 1F
不要傳區域變數的address就好 這樣寫它都會複製一份
06/19 02:07, 1F

06/19 02:37, , 2F
如果函式長這樣 int& fun(){int b return b;} int c=func();
06/19 02:37, 2F

06/19 02:37, , 3F
這種寫法會有安全性的問題嘛 我最後c會copy一份不是嘛?
06/19 02:37, 3F

06/19 02:38, , 4F
還是說copy之前就有機會 b值就不見了?
06/19 02:38, 4F

06/19 02:55, , 5F
non-static local reference 通常 compiler 會有警告
06/19 02:55, 5F

06/19 02:56, , 6F
考慮 int & c = func(); 的狀況
06/19 02:56, 6F

06/19 02:56, , 7F
甚至是 func() = c;
06/19 02:56, 7F

06/19 03:36, , 8F
二樓寫法func()優先權比較高會先執行,最後把b的值0xcccccccc
06/19 03:36, 8F

06/19 03:37, , 9F
mov到暫存器eax去,就完成return b;動作。然後c從eax接受該值
06/19 03:37, 9F

06/19 03:38, , 10F
所以return的東西實際上是到eax去取,而不是到b的記憶體位置取
06/19 03:38, 10F

06/19 03:39, , 11F
當然函數內部是不會在b消失之前,都還沒讓return b放到eax發生
06/19 03:39, 11F

06/19 04:44, , 12F
可以compile就是正確啊,只是不見得是你要的結果
06/19 04:44, 12F
文章代碼(AID): #1AEd_E2H (C_and_CPP)
文章代碼(AID): #1AEd_E2H (C_and_CPP)