看板 C_and_CPP 關於我們 聯絡資訊
我朋友最近去面試 其中有一個主管考一題 char *fun() { char str[] = {"Hello"}; return str; } void main() { char *p = NULL; p = fun(); printf("%s\n", p); } 問結果如何 主管給的回答是這樣可以把指標傳出來 所以可以印出結果 我的觀念是 function 的變數只要離開迴圈 都會被歸還OS(除了malloc) 我的想法對嗎? 我在公司電腦(ubuntu) 的確可以印出字串 囧 但家裡的電腦(ubuntu)卻印出亂碼 我有印出指標位址 的確可以把位址傳出來 我後來想想 在公司電腦可以順利印出字串 是運氣好 剛好那段位址的內容沒被覆蓋?? 如果想法有錯誤 請各位前輩能多給指導 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 180.177.11.95 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1513867566.A.E49.html
stupid0319: 放在memory stack,大概是當前ebp-4的位置吧 12/21 22:54
stupid0319: 而printf()中有區域變數的話,便會蓋過去的樣子 12/21 22:56
holik0123: 這應該rodata吧 12/21 23:04
stupid0319: printf含數的第一個區域變數有使用的用,str就被改了 12/21 23:06
loveflames: 這例子跟rodata無關 12/21 23:10
loveflames: 主管是要考你語言以外的底層機制嗎,如果不是就很雷 12/21 23:12
loveflames: 喔 12/21 23:12
LPH66: 如果 fun() 裡改成 char *str = "Hello"; 才可能跟 rodata 12/22 02:21
LPH66: 有關, 這邊這個寫法是確定一定是區域陣列變數 12/22 02:22
boss0405: 哪家主管啊...基本觀念耶... 12/22 13:21
loveflames: 如果是考語言以外的底層機制,那主管或許很神 12/22 13:34
loveflames: 但如果不是,這公司不去為妙,太雷 12/22 13:34
Schottky: 我不知道你們會不會,但我被考這題一定會問為什麼要這樣 12/22 13:42
Schottky: 考,順便問一下貴公司是不是常這樣寫,看看面試官程度 12/22 13:42
Schottky: 有趣的是... 面試官常常一問三不知,只說題目是從網路上 12/22 13:43
Schottky: 找來的,正確答案就是這樣但為什麼他不知道。耶嘿~ 12/22 13:44
hylkevin: 題目應該char *str[] = {"Hello"}; return str[0];才對 12/22 15:00
hylkevin: 吧? 12/22 15:00
b0920075: 編譯預設是開啟canary,所以ebp - 0x4應該會放canary才 12/22 15:39
b0920075: 對XDDD 12/22 15:39
jasonwu23: 考這種另類智力測驗實在沒什麼營養 12/22 18:47
nullptr: 塊陶啊 01/04 19:34