作者:
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塊陶啊