[問題] return pointer to local variable

作者: GamesWang (=ID)   2014-11-16 13:22:27
有爬文發現前面有人問過類似問題
但仍然不太清楚
以下舉例說明疑惑的點
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嗎?
為什麼可以正常執行甚至可以修改呢?
希望獲得大大們的解答
非常感謝
作者: nctucch17170 (kkadam)   2014-11-16 13:34:00
manip2 你回傳的不是指標
作者: carylorrk (carylorrk)   2014-11-16 13:44:00
1你說的對,3是指向 stirng literal,雖然 stringstring literal 是 static life time 所以回傳沒問題但是修改他是 undefined behavior...通常應該要宣告為const char*話說 2 回傳的是指標形態沒有錯吧?
作者: purpose (秀才遇到肥宅兵)   2014-11-16 13:59:00
mainp3 裡的 ret 是陣列,同理裡面的 ptr 回傳的位址值是屬於 mainp3 的 stack frame 範圍內,因此照你的程式最後要 cout 印出 923 很難,除非呼叫 cout 時剛好沒有把你存 923 的那塊覆寫掉,事實上我在 VC 根本印不出 923
作者: carylorrk (carylorrk)   2014-11-16 14:07:00
啊 真的 沒看清楚 XD
作者: GamesWang (=ID)   2014-11-16 15:16:00
所以manip3()能正常印出123甚至可以修改都是剛好嗎?他仍然是return 一個pointer to local variable?我是用code::blocks13.12測試
作者: bibo9901 (function(){})()   2014-11-16 16:12:00
yes, 都是運氣好
作者: GamesWang (=ID)   2014-11-16 16:52:00
十分感謝解答
作者: hakman (^____^)   2014-11-17 10:10:00
1與3 是回傳變數內的值,compiler 沒有去檢查這個值的來源而2 則是把local variable 的address 直接傳回去也就是說 1 3 的值是run time 才會知道,所以compiler 不會去檢查,而2 則沒有任何疑慮,絕對是local variable
作者: GamesWang (=ID)   2014-11-18 13:02:00
感謝樓上大大

Links booklink

Contact Us: admin [ a t ] ucptt.com