关于函数的返回值是局部变量问题

2019-07-20 23:49发布

小弟最近在纠结函数的返回值是局部变量的问题,看了网上大神的解答,主要有如下2个说法:
说法1>被调用函数的返回值是存放在栈中,退出被调用函数时,这个栈消失,但是值被拷贝一份,然后传给调用函数
说法2>调用函数和被调用函数共享同一个栈内存(被调用函数是调用函数内部的一个语句),所以,当退出被调用函数后,这个局部变量的栈内存没有消失,直到这个调用函数结束才退出.
请问大神:
问题1>如果说法1>成立,那么被拷贝的这个值是存放在哪里?CPU通用寄存器中,普通内存中?还是要看编译器的实现?
问题2>如果说法2>成立,那么假如这个调用函数也是main()函数的一个语句,那是不是说所有程序段都是共享一个栈内存(main()函数的栈内存)?似乎很矛盾啊?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
ianhom
1楼-- · 2019-07-21 04:41
本帖最后由 ianhom 于 2016-2-2 22:21 编辑

个人觉得说法1靠谱点,我平时使用的情况是子函数在执行完成,返回值是放到通用寄存器Rx中,举个例子u8Temp = Test1();,如果你看函数调用后的汇编的话,你会发现在退出函数后,还有个语句就是把这个Rx的值放到u8Temp。没有详细深入过,我觉得这个是编译器实现有关,楼主可以考虑在不同编译器不同编译优化等级下做几个试验。

对于说法2,这个子函数更像是宏函数或内联函数(inline),这时子函数就是相当于上层函数的一部分语句,这时就不会有压栈出栈等操作,这样的话子函数的局部变量就相当于上层函数的局部变量,在上层函数运行结束后失效。
ofourme
2楼-- · 2019-07-21 06:46
 精彩回答 2  元偷偷看……
liuchang
3楼-- · 2019-07-21 07:27
两位大神的看法不一样啊...这让小弟情何以堪~~~
小弟汇编看不懂,不知道大神有没有好的学习资料或者书籍推荐下(我使用的stm32单片机,属于ARM)

一周热门 更多>