函数可以返回局部变量么?

Daffodiles 2014-11-11 11:36:37

int M()
{
int a=2;
return a;
}


这个程序对么?
...全文
306 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
aiyaya730 2014-11-12
  • 打赏
  • 举报
回复
楼上说的很详细 <<effective c++>> 这本书里写得更详细
默伊清风 2014-11-12
  • 打赏
  • 举报
回复 2
一般的来说,函数是可以返回局部变量的。 局部变量的作用域只在函数内部,在函数返回后,局部变量的内存已经释放了。因此,如果函数返回的是局部变量的值,不涉及地址,程序不会出错。但是如果返回的是局部变量的地址(指针)的话,程序运行后会出错。因为函数只是把指针复制后返回了,但是指针指向的内容已经被释放了,这样指针指向的内容就是不可预料的内容,调用就会出错。准确的来说,函数不能通过返回指向栈内存的指针(注意这里指的是栈,返回指向堆内存的指针是可以的)。
xwuno1 2014-11-12
  • 打赏
  • 举报
回复
返回值是可以的,但是不能返回地址。这个比较重要
赵4老师 2014-11-12
  • 打赏
  • 举报
回复
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构…… 对学习编程者的忠告: 多用小脑和手,少用大脑、眼睛和嘴,会更快地学会编程! 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步Debug版对应汇编一行! 单步Debug版对应汇编千行不如单步Release版对应汇编一行! 单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。 VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。 (Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
mujiok2003 2014-11-12
  • 打赏
  • 举报
回复
int具有值语义, 返回的拷贝,所以没有问题。 但是int*或int&是引用语义, 没有返回拷贝, 所以不能返回局部变量的引用或地址。
starytx 2014-11-12
  • 打赏
  • 举报
回复
可以返回局部变量,一般所说的是不能返回局部变量的地址(比如说一个局部对象的指针)
xiaohuh421 2014-11-12
  • 打赏
  • 举报
回复
函数可以返回局部变量, 但一般不能返回局部变量指针. 返回局部变量, 只要是基本的数据类型, 那是没有问题的. 但如果返回的是一个类, 或者结构体就是需要考虑内部是否有指针, 如果有指针, 也可能是不安全的.
Daffodiles 2014-11-12
  • 打赏
  • 举报
回复
引用
楼上说的很详细<<effective c++>> 这本书里写得更详细
哪章哪节?
程序猿老曾 2014-11-12
  • 打赏
  • 举报
回复
引用 1 楼 Baoge_leopard 的回复:
一般的来说,函数是可以返回局部变量的。 局部变量的作用域只在函数内部,在函数返回后,局部变量的内存已经释放了。因此,如果函数返回的是局部变量的值,不涉及地址,程序不会出错。但是如果返回的是局部变量的地址(指针)的话,程序运行后会出错。因为函数只是把指针复制后返回了,但是指针指向的内容已经被释放了,这样指针指向的内容就是不可预料的内容,调用就会出错。准确的来说,函数不能通过返回指向栈内存的指针(注意这里指的是栈,返回指向堆内存的指针是可以的)。
Up
mymtom 2014-11-12
  • 打赏
  • 举报
回复
可以的,但是不能返回局部变量的地址


int *M()
  {
    int a=2;
    return &a;    /* bad */
  }

Lion_Peng 2014-11-12
  • 打赏
  • 举报
回复
引用 1 楼 Baoge_leopard 的回复:
一般的来说,函数是可以返回局部变量的。 局部变量的作用域只在函数内部,在函数返回后,局部变量的内存已经释放了。因此,如果函数返回的是局部变量的值,不涉及地址,程序不会出错。但是如果返回的是局部变量的地址(指针)的话,程序运行后会出错。因为函数只是把指针复制后返回了,但是指针指向的内容已经被释放了,这样指针指向的内容就是不可预料的内容,调用就会出错。准确的来说,函数不能通过返回指向栈内存的指针(注意这里指的是栈,返回指向堆内存的指针是可以的)。
+1
bear234 2014-11-12
  • 打赏
  • 举报
回复
一个函数return后,这个函数即结束,其中所有的在该函数内声明定义的变量全部死亡~~ 我们之所以能return a 是因为: 当程序走到reuturn a这句话的时候,其实是找了个临时的空间,复制一个a的副本,然后将这个副本返回,因为a已经死了~~ 当然,其实单纯从学习c++的角度而言,你暂时不需要知道这么详细,你只需要理解了1楼说的话就OK了 其他这些你学多了再回头来理解

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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