[問題] 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