[問題] return pointer to local variable

看板C_and_CPP (C/C++)作者 (=ID)時間11年前 (2014/11/16 13:22), 編輯推噓2(2019)
留言21則, 6人參與, 最新討論串1/1
有爬文發現前面有人問過類似問題 但仍然不太清楚 以下舉例說明疑惑的點 int *manip() { int ret=5; int *ptr = &ret; return ptr; //compiler沒有發出警告 } int *manip2() { int ret = 3; return &ret; //compiler有發出警告說 address of local variable returned } char *manip3() { char ret[]="123"; char *ptr = ret; return ptr; //正常無警告 } int main() { char *p3 = mainp3(); cout<<p3<<endl; //正常可執行 印出123 p3[0] = '9'; //正常可修改 cout<<p3<<endl; //印出正確 923 } 想請問各位大大, 1.manip()與manip2()是否為一樣的動作? 那為什麼compiler對於manip()不發警告? 是因為間接傳回位址的關係所以偵測不出來嗎? 2.manip3()回傳的不是pointer to local array variable嗎? 為什麼可以正常執行甚至可以修改呢? 希望獲得大大們的解答 非常感謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.171.251.98 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1416115349.A.6B8.html

11/16 13:34, , 1F
manip2 你回傳的不是指標
11/16 13:34, 1F

11/16 13:44, , 2F
1你說的對,3是指向 stirng literal,雖然 string
11/16 13:44, 2F

11/16 13:44, , 3F
string literal 是 static life time 所以回傳沒問題
11/16 13:44, 3F

11/16 13:45, , 4F
但是修改他是 undefined behavior...通常應該要宣告為
11/16 13:45, 4F

11/16 13:45, , 5F
const char*
11/16 13:45, 5F

11/16 13:46, , 6F
話說 2 回傳的是指標形態沒有錯吧?
11/16 13:46, 6F

11/16 13:59, , 7F
mainp3 裡的 ret 是陣列,同理裡面的 ptr 回傳的位址值
11/16 13:59, 7F

11/16 14:00, , 8F
是屬於 mainp3 的 stack frame 範圍內,因此照你的程式
11/16 14:00, 8F

11/16 14:01, , 9F
最後要 cout 印出 923 很難,除非呼叫 cout 時剛好沒有
11/16 14:01, 9F

11/16 14:01, , 10F
把你存 923 的那塊覆寫掉,事實上我在 VC 根本印不出 923
11/16 14:01, 10F

11/16 14:07, , 11F
啊 真的 沒看清楚 XD
11/16 14:07, 11F

11/16 15:16, , 12F
所以manip3()能正常印出123甚至可以修改都是剛好嗎?
11/16 15:16, 12F

11/16 15:17, , 13F
他仍然是return 一個pointer to local variable?
11/16 15:17, 13F

11/16 15:24, , 14F
我是用code::blocks13.12測試
11/16 15:24, 14F

11/16 16:12, , 15F
yes, 都是運氣好
11/16 16:12, 15F

11/16 16:52, , 16F
十分感謝解答
11/16 16:52, 16F

11/17 10:10, , 17F
1與3 是回傳變數內的值,compiler 沒有去檢查這個值的來源
11/17 10:10, 17F

11/17 10:11, , 18F
而2 則是把local variable 的address 直接傳回去
11/17 10:11, 18F

11/17 10:12, , 19F
也就是說 1 3 的值是run time 才會知道,所以compiler 不
11/17 10:12, 19F

11/17 10:12, , 20F
會去檢查,而2 則沒有任何疑慮,絕對是local variable
11/17 10:12, 20F

11/18 13:02, , 21F
感謝樓上大大
11/18 13:02, 21F
文章代碼(AID): #1KQ3ILQu (C_and_CPP)
文章代碼(AID): #1KQ3ILQu (C_and_CPP)