一个关于return局部变量的问题

urbanvice 2012-12-28 11:51:17
有这么一个简单的程序:
#include<iostream>

using namespace std;

int func()
{
int a = 1;
return a;
}

int main()
{
int Val;
Val = func();
return 0;
}

请教各位牛人,当一个函数返回局部变量的时候,函数调用一旦结束局部变量就会被销毁,上面的程序中=号操作是从哪取值赋给Val的呢?也就是说return如果是对返回值a进行复制,它会把a的值复制后存储在哪呢?然后=号操作又是如何知道从哪取值赋给Val?
...全文
638 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
塔格依力斯 2014-04-15
  • 打赏
  • 举报
回复
如果是返回局部变量的指针的话,是错误的
BadPattern 2012-12-28
  • 打赏
  • 举报
回复
引用 12 楼 urbanvice 的回复:
引用#3 返回局部变量的拷贝 然后局部变量销毁 这个拷贝可以是在寄存器中可以是在内存中这个和实现有关 我在网上搜了一下说是存储在exa通用寄存器中,但还有一点困惑就是=号操作是怎么知道到从哪个寄存器中再进行拷贝赋值给Val呢?
编译器实现呗,函数返回值放在%eax,任何读取函数返回值的动作都从%eax中读,不就好了
urbanvice 2012-12-28
  • 打赏
  • 举报
回复
引用
#3 返回局部变量的拷贝 然后局部变量销毁 这个拷贝可以是在寄存器中可以是在内存中这个和实现有关
我在网上搜了一下说是存储在exa通用寄存器中,但还有一点困惑就是=号操作是怎么知道到从哪个寄存器中再进行拷贝赋值给Val呢?
zslInSz 2012-12-28
  • 打赏
  • 举报
回复
alt+8 自己反汇编看下。返回值 绝大部分都是放在EAX寄存器中
BadPattern 2012-12-28
  • 打赏
  • 举报
回复
引用 9 楼 ForestDB 的回复:
就LZ的代码,a放在了EAX。
如9楼所说,一般情况函数的返回值放在%eax寄存器中由函数调用者去读,看看汇编的东西就明白了
ForestDB 2012-12-28
  • 打赏
  • 举报
回复
就LZ的代码,a放在了EAX。
xumaojun 2012-12-28
  • 打赏
  • 举报
回复
学习一下啦,有些函数返回值是void,是否需要return呢
xumaojun 2012-12-28
  • 打赏
  • 举报
回复
学习一下啦,有些函数返回值是void,是否需要return呢
ying0620 2012-12-28
  • 打赏
  • 举报
回复
其实基本类型不存在所谓『销毁』局部变量这么一说, 函数调用完成,退栈只是改变了栈顶寄存器的值,变量其实还在,直到另一个函数调用才被覆盖掉。
ying0620 2012-12-28
  • 打赏
  • 举报
回复
返回就是把return后面那个值存入上一层函数里被赋值那个变量。。这跟局部变量没关系,所以return a;和return 1没区别。 除非你是返回局部变量的地址,那就有问题了。总之,赋值即拷贝。
ctreewang 2012-12-28
  • 打赏
  • 举报
回复
楼主没有理解return 这个东东。。。去看一下。。
lin5161678 2012-12-28
  • 打赏
  • 举报
回复
返回局部变量的拷贝 然后局部变量销毁 这个拷贝可以是在寄存器中可以是在内存中这个和实现有关
东莞某某某 2012-12-28
  • 打赏
  • 举报
回复
楼主看下汇编代码 看看函数调用过程
dhdahai 2012-12-28
  • 打赏
  • 举报
回复
编译器产生一临时变量,用完自行销毁
赵4老师 2012-12-28
  • 打赏
  • 举报
回复
引用 2 楼 kuyucman 的回复:
楼主看下汇编代码 看看函数调用过程
引用 9 楼 ForestDB 的回复:
就LZ的代码,a放在了EAX。
对学习编程者的忠告: 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步对应汇编一行!
urbanvice 2012-12-28
  • 打赏
  • 举报
回复
嗯 谢谢 大家
zhangtonghui816 2012-12-28
  • 打赏
  • 举报
回复
引用 8 楼 xumaojun 的回复:
学习一下啦,有些函数返回值是void,是否需要return呢
如果你需要提前退出,用return 挺好的嘛 void fun() { if(条件) return; }

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧