OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7191|回复: 13

如果函数的返回值是个局部变量,会有什么影响

[复制链接]

119

主题

439

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1185
金钱
1185
注册时间
2015-9-18
在线时间
422 小时
发表于 2016-1-5 13:12:32 | 显示全部楼层 |阅读模式
10金钱
例如: int add(int a,int b)
{
int temp;
temp = a+b;
return temp;
}
这哪里有问题吗???

最佳答案

查看完整内容[请看2#楼]

返回局部变量的当前值。 没问题。
电子爱好者
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

58

主题

6293

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11474
金钱
11474
注册时间
2014-4-1
在线时间
1297 小时
发表于 2016-1-5 13:12:33 | 显示全部楼层

返回局部变量的当前值。
没问题。


回复

使用道具 举报

70

主题

6758

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
12989
金钱
12989
注册时间
2012-11-26
在线时间
3789 小时
发表于 2016-1-5 13:16:28 | 显示全部楼层
没有问题,楼主出问题了?
回复

使用道具 举报

306

主题

1426

帖子

12

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
7871
金钱
7871
注册时间
2015-10-15
在线时间
2874 小时
发表于 2016-1-5 14:21:09 | 显示全部楼层
返回即可。。。任何问题。。。其他地方调用这个函数,得到的值是多少就是多少。。。

有可能楼主学过面向对象语言,如果是面向对象语言,,,这方面就需要考虑多点。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

119

主题

439

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1185
金钱
1185
注册时间
2015-9-18
在线时间
422 小时
 楼主| 发表于 2016-1-5 16:39:41 | 显示全部楼层
好吧,应该是我自己出问题了
感谢大家
电子爱好者
回复

使用道具 举报

9

主题

538

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3371
金钱
3371
注册时间
2015-1-7
在线时间
794 小时
发表于 2016-1-5 17:47:10 | 显示全部楼层
别返回地址就行了
机器生汇编,汇编生B,B生C,C生万物.... 经过长期对C语言的研究,目前只有两个方面不懂:这也不懂,那也不懂
https://github.com/ianhom
回复

使用道具 举报

0

主题

12

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2015-11-24
在线时间
5 小时
发表于 2016-1-5 18:16:44 来自手机 | 显示全部楼层
不是局部变量的地址就没问题
回复

使用道具 举报

119

主题

439

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1185
金钱
1185
注册时间
2015-9-18
在线时间
422 小时
 楼主| 发表于 2016-1-5 21:02:52 | 显示全部楼层
没有对象的程序员 发表于 2016-1-5 18:16
不是局部变量的地址就没问题

那请问大神;为什么局部变量的地址不行?小弟不能理解
电子爱好者
回复

使用道具 举报

60

主题

409

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2814
金钱
2814
注册时间
2012-10-17
在线时间
653 小时
发表于 2016-1-6 11:04:49 | 显示全部楼层
這問題google很好查的...也比較詳細...

因為那個位址有可能又被其他函數使用了
另外局部變量也有可能被優化成在CPU register
所以任何情況下都不該返回一個局部變量地址

回复

使用道具 举报

119

主题

439

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1185
金钱
1185
注册时间
2015-9-18
在线时间
422 小时
 楼主| 发表于 2016-1-6 11:50:36 | 显示全部楼层
civic7366 发表于 2016-1-6 11:04
這問題google很好查的...也比較詳細...

因為那個位址有可能又被其他函數使用了

2个原因
第1个原因---被其它函数使用了?这个该如何理解,还没有退出函数,那这个地址还是被占用的,如何被其它函数使用呢?恳请大神指教
第2个原因---被优化成CPU register,这个很好理解,我能看懂,感谢大神了
电子爱好者
回复

使用道具 举报

60

主题

409

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2814
金钱
2814
注册时间
2012-10-17
在线时间
653 小时
发表于 2016-1-6 12:04:53 | 显示全部楼层
第1个原因---被其它函数使用了?这个该如何理解,还没有退出函数,那这个地址还是被占用的,如何被其它函数使用呢?恳请大神指教

都返回了..怎會還沒退出函數呢...
回复

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2016-1-6 14:47:49 来自手机 | 显示全部楼层
1原因。你add函数申请一个temp变量
回复

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2016-1-6 14:50:36 来自手机 | 显示全部楼层
它是存储在栈里面的,执行return之后是要弹栈(回收)的,所以返回的那个地址内容可能会被修改(再进函数或再有局部变量会覆盖)
回复

使用道具 举报

60

主题

409

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2814
金钱
2814
注册时间
2012-10-17
在线时间
653 小时
发表于 2016-1-6 15:31:13 | 显示全部楼层
在add調用的時候被壓棧的有 返回位址跟參數a,b之後才是temp

可以仿真看看SP的變化跟位址裡面的data是什麼...



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-25 21:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表