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

看板C_and_CPP作者 (Void)時間6年前 (2017/12/22 15:36), 6年前編輯推噓11(11024)
留言35則, 12人參與, 6年前最新討論串2/2 (看更多)
※ 引述《gamed (Maiko)》之銘言: : 我朋友最近去面試 : 其中有一個主管考一題 : char *fun() : { : char str[] = {"Hello"}; : return str; : } : void main() : { : char *p = NULL; : p = fun(); : printf("%s\n", p); : } : 問結果如何 : 主管給的回答是這樣可以把指標傳出來 指標傳出來我想是沒問題的,這樣就單純把指到這空間的地址回傳出來而已,除非編 譯器很好心幫你加工過 : 所以可以印出結果 是可以印出東西,但東西是不是對的比較重要XDD : 我的觀念是 function 的變數只要離開迴圈 : 都會被歸還OS(除了malloc) : 我的想法對嗎? OS應該是程式結束後才會接手吧?離開function,東西還是會留在那,但下一個用到 該空間的function如果有對該空間寫值就會被蓋過去,你一點辦法都沒有,換句話說 無法保證資料的正確性 : 我在公司電腦(ubuntu) : 的確可以印出字串 囧 那就只是剛好沒有function對該空間寫值 : 但家裡的電腦(ubuntu)卻印出亂碼 info leak ! : 我有印出指標位址 : 的確可以把位址傳出來 我自己用gcc 5.4測試,看起來編譯器會在fun()結尾的時候把rax歸0,不讓指向區域 變數的指標回傳 : 我後來想想 : 在公司電腦可以順利印出字串 : 是運氣好 剛好那段位址的內容沒被覆蓋?? : 如果想法有錯誤 : 請各位前輩能多給指導 : 謝謝 就是運氣好別懷疑,後續的printf裏面用的變數也是用stack上的空間存放,沒被蓋掉 真的就是運氣好 這種寫法很糟,很容易有安全性問題,就像你在家試的時候印出的亂碼很可能就是洩 漏出敏感地址,讓系統保護形同虛設 大概是這樣子吧,不知道有沒有說錯QQ -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.117.178.137 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1513928161.A.0DB.html

12/22 17:19, 6年前 , 1F
先不論對錯 主管這樣考就是預期你面試的時候 講出這篇8成的
12/22 17:19, 1F

12/22 17:20, 6年前 , 2F
內容... 可見這種面試多沒有成效
12/22 17:20, 2F

12/22 17:21, 6年前 , 3F
我不太能理解為何面試要搞的像震撼教育 然後逼的來面試的人
12/22 17:21, 3F

12/22 17:21, 6年前 , 4F
除了被洗臉之外 還要回家上網google 上ptt問解答
12/22 17:21, 4F
原先我看到原文以為主管在考不要回傳區域陣列地址這種觀念,但是看描述怎麼覺得主管才是搞不清楚的XDDD

12/22 17:23, 6年前 , 5F
我倒是很喜歡這種開放式問答的題目 XD
12/22 17:23, 5F

12/22 17:38, 6年前 , 6F
那請問一下該怎麼寫才不會有memory leak 又可以在函數外pr
12/22 17:38, 6F

12/22 17:38, 6年前 , 7F
int?
12/22 17:38, 7F
如樓下所說,建議是malloc一個空間,把你要寫的東西放在malloc出來的空間裏面,因為空間在heap內,所以不 會因為離開function而喪失控制權,malloc出來的空間會喪失控制權就是在你free掉空間的時候,當然如果free完 又去讀寫空間,也會造成安全性問題:info leak和use after free 至於global array的話,如果宣告即給初始值會放在data,沒有的話放在bss,不管放哪個沒有控制權喪失的問題 但是當你不用的話你也不能回收再利用,相較malloc可以把不用的空間free掉,這種使用方式比較......不節約?

12/22 17:45, 6年前 , 8F
1. global char[] 2. heap allocation (preferred)
12/22 17:45, 8F

12/22 17:49, 6年前 , 9F
static local
12/22 17:49, 9F
※ 編輯: b0920075 (140.117.178.137), 12/22/2017 18:06:58

12/22 18:12, 6年前 , 10F
這麼基本的問題如果還不懂很難想像寫出來的code會多可怕
12/22 18:12, 10F

12/22 18:12, 6年前 , 11F
但可怕的是原PO的主管似乎認為可以這樣用
12/22 18:12, 11F

12/22 18:14, 6年前 , 12F
不過我也曾經聽過有某公司軟體主管說extern global
12/22 18:14, 12F

12/22 18:14, 6年前 , 13F
variable不要放在header file,然後說出一個錯誤的原因
12/22 18:14, 13F

12/23 00:37, 6年前 , 14F
如果面試遇到樓上講的那樣的主管該怎麼辦啊 orz
12/23 00:37, 14F

12/23 02:31, 6年前 , 15F
當然是塊陶,面試官是你以後的同事,有這種雷同事哪行
12/23 02:31, 15F

12/23 14:48, 6年前 , 16F
那在c++ 就是char *ptr = new char[5] 這樣嗎?
12/23 14:48, 16F

12/23 15:04, 6年前 , 17F
在 c++應該會用 string XD 沒事不會砸自己的腳
12/23 15:04, 17F

12/23 15:35, 6年前 , 18F
哎呀!單純疑問觀念 現實有STL可以用當然用
12/23 15:35, 18F

12/23 17:01, 6年前 , 19F
最好加上{}
12/23 17:01, 19F

12/24 09:46, 6年前 , 20F
有個疑問 c++在function new出來的 應該也不能傳出來
12/24 09:46, 20F

12/24 09:46, 6年前 , 21F
吧?
12/24 09:46, 21F

12/24 09:47, 6年前 , 22F
我好像弄錯了 這邊我在想想
12/24 09:47, 22F

12/24 10:01, 6年前 , 23F
new 和 malloc 在根本上是一樣的概念
12/24 10:01, 23F

12/24 10:26, 6年前 , 24F
兩個實作或許一樣,不過new是free store,malloc是hea
12/24 10:26, 24F

12/24 10:26, 6年前 , 25F
p
12/24 10:26, 25F

12/24 23:08, 6年前 , 26F
我想要知道為什麼 extern global variable 不要放在header
12/24 23:08, 26F

12/24 23:08, 6年前 , 27F
file ,有人可以說明一下嗎? 感恩
12/24 23:08, 27F

12/24 23:32, 6年前 , 28F
樓上,因為那主管搞錯觀念了,所以這結論也是錯的XD
12/24 23:32, 28F

12/28 14:58, 6年前 , 29F
new傳出來不是不行 只是是不好的寫法
12/28 14:58, 29F

12/28 14:58, 6年前 , 30F
通常來講new/delete要在同一個scope做,不能A()new了
12/28 14:58, 30F

12/28 14:58, 6年前 , 31F
傳出來要使用者自己delete
12/28 14:58, 31F

12/28 14:59, 6年前 , 32F
不然就得wrap一下 比方說C* Alloc() 跟 Release(C*)
12/28 14:59, 32F

12/28 14:59, 6年前 , 33F
C*再用typedef包一下或者拿個warpper class處理一下
12/28 14:59, 33F

12/28 15:00, 6年前 , 34F
btw, shared_ptr好方便的啊..大家都忘了很多原則了XD
12/28 15:00, 34F

12/29 03:23, 6年前 , 35F
還是 Rust 大法好, 加上 lifetime 不會有這個問題了 (欸
12/29 03:23, 35F
文章代碼(AID): #1QFBNX3R (C_and_CPP)
文章代碼(AID): #1QFBNX3R (C_and_CPP)