打印
[C语言]

函数返回栈变量?

[复制链接]
1299|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yanghelovehuang|  楼主 | 2018-9-3 13:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 yanghelovehuang 于 2018-9-3 17:19 编辑

大神们 函数不能返回栈变量(局部变量),因为栈变量(局部变量)到函数结束时就会被释放。但是今天在网上看到一个人写的程序:
int getLen(int num)    //计算该数一共有多少位(长度){   
int flags = 0;   
for (num; num >0 ; num/=10)      
{        flags++;       }   
return flags;   //返回位数(长度)
}
他好多函数都是这样返回栈变量 他这样不对吧? 毕竟是网上大神发的帖子我也不敢随便怀疑,所以问下大家对吗? 如果对 不能返回栈变量为什么他就可以?

相关帖子

沙发
杨爱林林| | 2018-9-3 16:12 | 只看该作者
照你这么说,那函数都不用返回了,操作系统、文件系统等等也不要设计了。
建议基础打牢

使用特权

评论回复
板凳
ayb_ice| | 2018-9-3 16:30 | 只看该作者
这是返回值好不好,变量的值
不能返回局部变量的地址(静态变量除外)

使用特权

评论回复
地板
yanghelovehuang|  楼主 | 2018-9-3 17:19 | 只看该作者
杨爱林林 发表于 2018-9-3 16:12
照你这么说,那函数都不用返回了,操作系统、文件系统等等也不要设计了。
建议基础打牢 ...

那你来说说函数怎么返回局部变量? 函数结束局部变量就被释放了怎么返回?

使用特权

评论回复
5
yanghelovehuang|  楼主 | 2018-9-3 17:29 | 只看该作者
yanghelovehuang 发表于 2018-9-3 17:19
那你来说说函数怎么返回局部变量? 函数结束局部变量就被释放了怎么返回? ...

函数弹栈之后该函数占用的栈内存自然就被释放掉了(重点是……栈)。我们返回的局部变量实际上已经不是局部变量本身了,而是它的复制品。
他的原理是这样的,你要知道就解释清楚,不要啥也没解释呢就训人,我是来求教的,不是来求训的。

使用特权

评论回复
6
Prry| | 2018-9-3 22:25 | 只看该作者
返回值:该值已经从内中拷贝出来,你释放内存不影响我。
返回地址(指针):准确来说是可以返回栈地址的,只不过该地址对应的内存已经释放,再通过该地址(指针)去访问那段内存,当然会出错。或者该地址(指针)称为野指针!
通俗解析:我在xx银行存100块。

使用特权

评论回复
7
杨爱林林| | 2018-9-4 08:54 | 只看该作者
yanghelovehuang 发表于 2018-9-3 17:29
函数弹栈之后该函数占用的栈内存自然就被释放掉了(重点是……栈)。我们返回的局部变量实际上已经不是局 ...

我可没那个闲工夫来训你,就说了句基础打牢就玻璃心啦?

网上的原话:“程序的运行过程是依照栈的规则,函数开始调用就是压栈,函数调用结束就是弹栈。函数弹栈之后该函数占用的栈内存自然就被释放掉了(重点是……栈)。我们返回的局部变量实际上已经不是局部变量本身了,而是它的复制品。系统会创建一个临时变量来拷贝被return的变量的值。”

另外之前看过你发过一些帖子,也回复过,所以还是基础打牢会比较好。

使用特权

评论回复
8
yanghelovehuang|  楼主 | 2018-9-4 09:33 | 只看该作者
杨爱林林 发表于 2018-9-4 08:54
我可没那个闲工夫来训你,就说了句基础打牢就玻璃心啦?

网上的原话:“程序的运行过程是依照栈的规则, ...

现在正在打基础啊, 以前我很少发帖子,现在正在学习所以会遇到很多问题,我是想一边发帖子问问大神,因为不同的人有不同的观点,能学到很多其他人好的观点,想法。一边自己查找,学习。
所以我问的一些问题可能对你们来说是小儿科,但对我来说他的原理实现方法,用法我都不太清楚。毕竟人与人之间交流比看资料自己学习快。有时候一件事自己想好久想不通,被人一句话说明白了,我发贴就是这个目的,不是不打基础遇到问题就问,我是想以最快的方法打基础。
还有就是谢谢您能够看我的帖子并回复我,我确实有点玻璃心,对别人的话很在意,您别在意。

使用特权

评论回复
9
杨爱林林| | 2018-9-4 10:00 | 只看该作者
yanghelovehuang 发表于 2018-9-4 09:33
现在正在打基础啊, 以前我很少发帖子,现在正在学习所以会遇到很多问题,我是想一边发帖子问问大神,因 ...

没别的意思,加油

使用特权

评论回复
10
yanghelovehuang|  楼主 | 2018-9-4 15:26 | 只看该作者
杨爱林林 发表于 2018-9-4 10:00
没别的意思,加油

谢谢 新手出动 还望海涵

使用特权

评论回复
11
chongdongchen| | 2018-9-4 15:29 | 只看该作者
yanghelovehuang 发表于 2018-9-4 15:26
谢谢 新手出动 还望海涵

给楼主的学习态度点赞!

使用特权

评论回复
12
QuakeGod| | 2018-9-4 17:36 | 只看该作者
这个问题回答起来还是比较复杂的,需要对C和C++语言有比较深的研究,如果有汇编语言的基础更好一些。

对于函数简单返回值,
如果是简单数据类型,是通过寄存器返回的,比如整形,长整型,字符型,bool型,指针型。
比如AX,EAX,AX:DX,EAX:EDX,RAX,
对于浮点型是通过 FP0,XMM0,YMM0等返回;
如果返回值是结构体或者类(不是结构体指针或者类指针哦),说起来就复杂多了,还真是通过栈来返回的。
函数调用之前,先在栈上分配一个空间,作为存储返回值用,在函数return以后,栈并不清空,等待复制结束后,栈才清空。


使用特权

评论回复
13
pkuzhx| | 2018-9-5 17:33 | 只看该作者
自己实践一下就理解了,而且网上大把的源代码都是这么写的,要是不能这么返回,世界就崩溃了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

156

主题

324

帖子

1

粉丝