[問題] function 裡的變數 存活時間

看板C_and_CPP作者 (Maiko)時間6年前 (2017/12/21 22:46), 編輯推噓5(5017)
留言22則, 10人參與, 7年前最新討論串1/2 (看更多)
我朋友最近去面試 其中有一個主管考一題 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

12/21 22:54, 6年前 , 1F
放在memory stack,大概是當前ebp-4的位置吧
12/21 22:54, 1F

12/21 22:56, 6年前 , 2F
而printf()中有區域變數的話,便會蓋過去的樣子
12/21 22:56, 2F

12/21 23:04, 6年前 , 3F
這應該rodata吧
12/21 23:04, 3F

12/21 23:06, 6年前 , 4F
printf含數的第一個區域變數有使用的用,str就被改了
12/21 23:06, 4F

12/21 23:10, 6年前 , 5F
這例子跟rodata無關
12/21 23:10, 5F

12/21 23:12, 6年前 , 6F
主管是要考你語言以外的底層機制嗎,如果不是就很雷
12/21 23:12, 6F

12/21 23:12, 6年前 , 7F
12/21 23:12, 7F

12/22 02:21, 6年前 , 8F
如果 fun() 裡改成 char *str = "Hello"; 才可能跟 rodata
12/22 02:21, 8F

12/22 02:22, 6年前 , 9F
有關, 這邊這個寫法是確定一定是區域陣列變數
12/22 02:22, 9F

12/22 13:21, 6年前 , 10F
哪家主管啊...基本觀念耶...
12/22 13:21, 10F

12/22 13:34, 6年前 , 11F
如果是考語言以外的底層機制,那主管或許很神
12/22 13:34, 11F

12/22 13:34, 6年前 , 12F
但如果不是,這公司不去為妙,太雷
12/22 13:34, 12F

12/22 13:42, 6年前 , 13F
我不知道你們會不會,但我被考這題一定會問為什麼要這樣
12/22 13:42, 13F

12/22 13:42, 6年前 , 14F
考,順便問一下貴公司是不是常這樣寫,看看面試官程度
12/22 13:42, 14F

12/22 13:43, 6年前 , 15F
有趣的是... 面試官常常一問三不知,只說題目是從網路上
12/22 13:43, 15F

12/22 13:44, 6年前 , 16F
找來的,正確答案就是這樣但為什麼他不知道。耶嘿~
12/22 13:44, 16F

12/22 15:00, 6年前 , 17F
題目應該char *str[] = {"Hello"}; return str[0];才對
12/22 15:00, 17F

12/22 15:00, 6年前 , 18F
吧?
12/22 15:00, 18F

12/22 15:39, 6年前 , 19F
編譯預設是開啟canary,所以ebp - 0x4應該會放canary才
12/22 15:39, 19F

12/22 15:39, 6年前 , 20F
對XDDD
12/22 15:39, 20F

12/22 18:47, 6年前 , 21F
考這種另類智力測驗實在沒什麼營養
12/22 18:47, 21F

01/04 19:34, 7年前 , 22F
塊陶啊
01/04 19:34, 22F
文章代碼(AID): #1QEyakv9 (C_and_CPP)
文章代碼(AID): #1QEyakv9 (C_and_CPP)