Re: [问题] function 里的变量 存活时间

楼主: b0920075 (Void)   2017-12-22 15:35:57
※ 引述《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
作者: galic (嘎利)   2017-12-22 17:19:00
先不论对错 主管这样考就是预期你面试的时候 讲出这篇8成的内容... 可见这种面试多没有成效我不太能理解为何面试要搞的像震撼教育 然后逼的来面试的人除了被洗脸之外 还要回家上网google 上ptt问解答
作者: Hazukashiine (私は幸せです)   2017-12-22 17:23:00
我倒是很喜欢这种开放式问答的题目 XD
作者: mmmmei (mmm煤)   2017-12-22 17:38:00
那请问一下该怎么写才不会有memory leak 又可以在函数外print?
作者: Hazukashiine (私は幸せです)   2017-12-22 17:45:00
1. global char[] 2. heap allocation (preferred)
作者: loveflames (咕啾咕啾魔法阵)   2017-12-22 17:49:00
static local
作者: boss0405 (boss)   2017-12-22 18:12:00
这么基本的问题如果还不懂很难想像写出来的code会多可怕但可怕的是原PO的主管似乎认为可以这样用不过我也曾经听过有某公司软件主管说extern globalvariable不要放在header file,然后说出一个错误的原因
作者: CoNsTaR ((const *))   2017-12-23 00:37:00
如果面试遇到楼上讲的那样的主管该怎么办啊 orz
作者: Schottky (顺风相送)   2017-12-23 02:31:00
当然是块陶,面试官是你以后的同事,有这种雷同事哪行
作者: mmmmei (mmm煤)   2017-12-23 14:48:00
那在c++ 就是char *ptr = new char[5] 这样吗?
作者: steve1012 (steve)   2017-12-23 15:04:00
在 c++应该会用 string XD 没事不会砸自己的脚
作者: mmmmei (mmm煤)   2017-12-23 15:35:00
哎呀!单纯疑问观念 现实有STL可以用当然用
作者: loveflames (咕啾咕啾魔法阵)   2017-12-23 17:01:00
最好加上{}
作者: NoManInCar (NMIC)   2017-12-24 09:46:00
有个疑问 c++在function new出来的 应该也不能传出来吧?我好像弄错了 这边我在想想
作者: uranusjr (←這人是超級笨蛋)   2017-12-24 10:01:00
new 和 malloc 在根本上是一样的概念
作者: loveflames (咕啾咕啾魔法阵)   2017-12-24 10:26:00
两个实作或许一样,不过new是free store,malloc是heap
作者: hakman (^____^)   2017-12-24 23:08:00
我想要知道为什么 extern global variable 不要放在headerfile ,有人可以说明一下吗? 感恩
作者: boss0405 (boss)   2017-12-24 23:32:00
楼上,因为那主管搞错观念了,所以这结论也是错的XD
作者: Killercat (杀人猫™)   2017-12-28 14:58:00
new传出来不是不行 只是是不好的写法通常来讲new/delete要在同一个scope做,不能A()new了传出来要使用者自己delete不然就得wrap一下 比方说C* Alloc() 跟 Release(C*)C*再用typedef包一下或者拿个warpper class处理一下btw, shared_ptr好方便的啊..大家都忘了很多原则了XD
作者: uranusjr (←這人是超級笨蛋)   2017-12-29 03:23:00
还是 Rust 大法好, 加上 lifetime 不会有这个问题了 (欸

Links booklink

Contact Us: admin [ a t ] ucptt.com