楼主:
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)却印出乱码
我有印出指标位址
的确可以把位址传出来
我后来想想
在公司电脑可以顺利印出字串
是运气好 刚好那段位址的内容没被覆蓋??
如果想法有错误
请各位前辈能多给指导
谢谢
放在memory stack,大概是当前ebp-4的位置吧而printf()中有区域变量的话,便会盖过去的样子
printf含数的第一个区域变量有使用的用,str就被改了
这例子跟rodata无关主管是要考你语言以外的底层机制吗,如果不是就很雷喔
作者:
LPH66 (-6.2598534e+18f)
2017-12-22 02:21:00如果 fun() 里改成 char *str = "Hello"; 才可能跟 rodata有关, 这边这个写法是确定一定是区域阵列变量
如果是考语言以外的底层机制,那主管或许很神但如果不是,这公司不去为妙,太雷
我不知道你们会不会,但我被考这题一定会问为什么要这样考,顺便问一下贵公司是不是常这样写,看看面试官程度有趣的是... 面试官常常一问三不知,只说题目是从网络上找来的,正确答案就是这样但为什么他不知道。耶嘿~
题目应该char *str[] = {"Hello"}; return str[0];才对吧?
编译默认是开启canary,所以ebp - 0x4应该会放canary才对XDDD
作者:
nullptr (SIGSEGV)
2016-01-04 19:34:00块陶啊