[问题] 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