[问题] function 里的变量 存活时间

楼主: gamed (Maiko)   2017-12-21 22:46:04
我朋友最近去面试
其中有一个主管考一题
char *fun()
{
char str[] = {"Hello"};
return str;
}
void main()
{
char *p = NULL;
p = fun();
printf("%s\n", p);
}
问结果如何
主管给的回答是这样可以把指标传出来
所以可以印出结果
我的观念是 function 的变量只要离开循环
都会被归还OS(除了malloc)
我的想法对吗?
我在公司电脑(ubuntu)
的确可以印出字串 囧
但家里的电脑(ubuntu)却印出乱码
我有印出指标位址
的确可以把位址传出来
我后来想想
在公司电脑可以顺利印出字串
是运气好 刚好那段位址的内容没被覆蓋??
如果想法有错误
请各位前辈能多给指导
谢谢
作者: stupid0319 (征女友)   2017-12-21 22:54:00
放在memory stack,大概是当前ebp-4的位置吧而printf()中有区域变量的话,便会盖过去的样子
作者: holik0123   2017-12-21 23:04:00
这应该rodata吧
作者: stupid0319 (征女友)   2017-12-21 23:06:00
printf含数的第一个区域变量有使用的用,str就被改了
作者: loveflames (咕啾咕啾魔法阵)   2017-12-21 23:10:00
这例子跟rodata无关主管是要考你语言以外的底层机制吗,如果不是就很雷喔
作者: LPH66 (-6.2598534e+18f)   2017-12-22 02:21:00
如果 fun() 里改成 char *str = "Hello"; 才可能跟 rodata有关, 这边这个写法是确定一定是区域阵列变量
作者: boss0405 (boss)   2017-12-22 13:21:00
哪家主管啊...基本观念耶...
作者: loveflames (咕啾咕啾魔法阵)   2017-12-22 13:34:00
如果是考语言以外的底层机制,那主管或许很神但如果不是,这公司不去为妙,太雷
作者: Schottky (顺风相送)   2017-12-22 13:42:00
我不知道你们会不会,但我被考这题一定会问为什么要这样考,顺便问一下贵公司是不是常这样写,看看面试官程度有趣的是... 面试官常常一问三不知,只说题目是从网络上找来的,正确答案就是这样但为什么他不知道。耶嘿~
作者: hylkevin (19s)   2017-12-22 15:00:00
题目应该char *str[] = {"Hello"}; return str[0];才对吧?
作者: b0920075 (Void)   2017-12-22 15:39:00
编译默认是开启canary,所以ebp - 0x4应该会放canary才对XDDD
作者: jasonwu23 (jasonwu)   2017-12-22 18:47:00
考这种另类智力测验实在没什么营养
作者: nullptr (SIGSEGV)   2016-01-04 19:34:00
块陶啊

Links booklink

Contact Us: admin [ a t ] ucptt.com