为什么在一个函数里定义的结构体,可以被返回使用?

昵称是神马 2013-01-04 10:56:12
struct STR
{
int a;
char b;
};
STR f(int a, char b)
{
STR st;
st.a = a;
st.b = b;
return st;
}
int main()
{
STR st = f(1, 'a');
cout<<st.a<<endl;
cout<<st.b<<endl;
return 0;
}
为什么这样写,main里面的st可以得到正确的值啊?用1、'a'初始化f()里面的st的时候,f调用结束,里面的st不是会被自动销毁吗?
...全文
1522 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
有点清眸 2013-01-05
  • 打赏
  • 举报
回复
函数调用是基于栈的。了解下函数调用返回时 栈指针的变化,应该算悟透了。
赵4老师 2013-01-05
  • 打赏
  • 举报
回复
既然函数能返回结构体,那为什么函数不返回整个互联网内容呢?
WizardOz 2013-01-05
  • 打赏
  • 举报
回复 1
这是可以的,因为函数返回时做了一次结构体赋值。 但是现实中的代码一般不会这么写,将结构体变量作为函数参数或返回值会产生额外的开销,一般是用指针。
林石公 2013-01-05
  • 打赏
  • 举报
回复
至于是否返回一个copy,印象中,不同的编译器有时的工作方式还有可能不一样呢,可能有的编译器直接把局部变量返回(VC,GCC似乎有些细微的区别) 我只是凭印象乱说的,最终还是代码走一遍可靠
hongtao1126 2013-01-04
  • 打赏
  • 举报
回复
跟浅拷贝 深拷贝有点关系. struct STR { int a; char b; char *d; }; STR f(int a, char b) { STR st; char m[] = "3213"; st.a = a; st.b = b; st.d = m; return st; } int main() { STR st = f(1, 'a'); cout<<st.a<<endl; cout<<st.b<<endl; cout<<st.d<<endl; return 0; } 这个就不行了 这个就出现野指针了
wuxupu 2013-01-04
  • 打赏
  • 举报
回复
理解return语句所做的事情,return会复制原来结果的值到一个匿名变量,然后销毁局部变量。
昵称是神马 2013-01-04
  • 打赏
  • 举报
回复
引用 6 楼 lin5161678 的回复:
st销毁了 返回的不是st 是一个st的拷贝 数据都和st一样 不过不是同一个对象 int func(){ int i=100; return i; } 一样的道理 i已经被销毁 返回的是i的拷贝 数据和i一样是100 但是 不是同一个对象了 int* func(){ int i; return &i; } i已经被销毁 返回的是&a……
函数里局部变量的指针,不能返回使用吗?什么时候返回的是拷贝,什么时候返回的不是呢?
lin5161678 2013-01-04
  • 打赏
  • 举报
回复
st销毁了 返回的不是st 是一个st的拷贝 数据都和st一样 不过不是同一个对象 int func(){ int i=100; return i; } 一样的道理 i已经被销毁 返回的是i的拷贝 数据和i一样是100 但是 不是同一个对象了 int* func(){ int i; return &i; } i已经被销毁 返回的是&i 一个指向i的指针 即指向无效对象的指针 这样如果对这个指针解引用 那就会出问题了 ///另外就是 在这里能得到正确的值 代码也是正确的 但是我想说的是 有时候 能得到正确的值 说明不了说明的 代码错误 运行时候没暴露出来而已
昵称是神马 2013-01-04
  • 打赏
  • 举报
回复
1、只要没有指针缓冲区的简单对象 都可以作为返回值 不懂这句啊。。。
昵称是神马 2013-01-04
  • 打赏
  • 举报
回复
那哪些情况不能用来作为函数的返回值呢?
竞天问 2013-01-04
  • 打赏
  • 举报
回复
这种返回,返回时会复制对象内容。 在C++11里还有一个move语义,这个以后再说了。 像你这样的返回, 1、只要没有指针缓冲区的简单对象 2、有正确的复制构造函数的 都可以作为返回值
sublimepan 2013-01-04
  • 打赏
  • 举报
回复
函数返回后会将f函数中st的内存按位拷贝给你main中的st
昵称是神马 2013-01-04
  • 打赏
  • 举报
回复
哪些不能被用来做函数的返回值呢?求指导~
smilenot 2013-01-04
  • 打赏
  • 举报
回复
你理解"传值"与"传指针"的区别,就明白了
BadPattern 2013-01-04
  • 打赏
  • 举报
回复
函数返回一个局部对象,会调用该对象的拷贝构造函数产生一个拷贝返回出去。
derekrose 2013-01-04
  • 打赏
  • 举报
回复
知道原理,明确目的,不要去追求知识上的盲区
昵称是神马 2013-01-04
  • 打赏
  • 举报
回复
引用 15 楼 zilaishuichina 的回复:
lz弄清楚 return做了什么事情 应该就相当明了了
我晚上回去还是看看return
昵称是神马 2013-01-04
  • 打赏
  • 举报
回复
引用 17 楼 everyearr 的回复:
有些细节,不用去穷究的,黑盒子有时比白盒子来得有效,用归纳的方式
有道理啊,我老想弄清楚底层细节
昵称是神马 2013-01-04
  • 打赏
  • 举报
回复
引用 13 楼 zhao4zhong1 的回复:
对学习编程者的忠告: 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步对应汇编一行!
不会反汇编
everyearr 2013-01-04
  • 打赏
  • 举报
回复
有些细节,不用去穷究的,黑盒子有时比白盒子来得有效,用归纳的方式
加载更多回复(7)

65,179

社区成员

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

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