c++的引用

腰刀首帕从军 2017-12-26 06:09:02
#include<iostream>
using namespace std;

int & g()
{
int c= 3;
return c;
}


int main()
{
int a = g();
int& b = g();

printf("a = %d\n", a);

printf("b = %d\n", b);




system("pause");
return 0;
}

单步调试的时候发现打印3,和-2谁能解释下?
...全文
1115 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2018-05-03
  • 打赏
  • 举报
回复
加static修饰的局部变量另当别论。
ggglivw 2018-05-03
  • 打赏
  • 举报
回复
引用 9 楼 lizi_stdio 的回复:
不要返回对局部变量的引用的引用! 不要返回对局部变量的引用的引用! 不要返回对局部变量的引用的引用!
+1. 局部变量的内存离开函数会被释放,你没法继续引用. 你用最新的编译器,这种不报错?
qq_40162781 2018-05-02
  • 打赏
  • 举报
回复
不能返回引用的千万别返回引用 #include<iostream> using namespace std; int &fun(int i); int main() { int &a = fun(4); int &b = fun(8); cout <<(a==b)<< endl; system("pause"); return 0; } int &fun(int i) { static int p; p = i; return p; }
热血打工人 2018-03-29
  • 打赏
  • 举报
回复
引用地址是八位数字,这有点大,导致溢出。
EL-PAAS微服务 2018-03-15
  • 打赏
  • 举报
回复
int & g() { int c= 3; return c; } 这个引用就有问题,返回局部变量的引用,出了函数就销毁了,外面继续引用就是范围野地址,什么都有可能发生。
super_admi 2018-02-10
  • 打赏
  • 举报
回复
你这就不是关于“C++引用”的问题,纯粹是关于“C++局部变量”的问题,和引用没有半点关系。
destory27 2018-02-10
  • 打赏
  • 举报
回复
引用作为返回值,必须遵守以下规则: (1)不能返回局部变量的引用。主要原因是局部变量会在函数返回后被销毁,因此被返回的引用就成为了"无所指"的引用,程序会进入未知状态。 (2)不能返回函数内部new分配的内存的引用。虽然不存在局部变量的被动销毁问题,可对于这种情况(返回函数内部new分配内存的引用),又面临其它尴尬局面。例如,被函数返回的引用只是作为一 个临时变量出现,而没有被赋予一个实际的变量,那么这个引用所指向的空间(由new分配)就无法释放,造成memory leak。 (3)可以返回类成员的引用,但最好是const。主要原因是当对象的属性是与某种业务规则(business rule)相关联的时候,其赋值常常与某些其它属性或者对象的状态有关,因此有必要将赋值操作封装在一个业务规则当中。如果其它对象可以获得该属性的非常 量引用(或指针),那么对该属性的单纯赋值就会破坏业务规则的完整性。
AlbertS 2018-02-10
  • 打赏
  • 举报
回复
不要返回对局部变量的引用的引用!
pxw_ps 2018-02-09
  • 打赏
  • 举报
回复
编译器没报错只说明没有语法,所有软件上线前编译都通过了,然而bug依旧满天飞
赵4老师 2018-01-10
  • 打赏
  • 举报
回复
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……
lizi_stdio 2018-01-09
  • 打赏
  • 举报
回复
不要返回对局部变量的引用的引用! 不要返回对局部变量的引用的引用! 不要返回对局部变量的引用的引用!
赵4老师 2018-01-08
  • 打赏
  • 举报
回复
栈中的变量通常包括函数参数和函数里声明的临时变量。 栈中的基本变量退出其作用域时,没有谁执行一段代码去释放/销毁/析构它所占用的内存,仅仅是没人再去理会的留在当前栈顶上方的若干遗留下来可被后续压栈操作覆盖的无用数据而已。 而栈中的类变量退出其作用域时,会自动执行其析构函数,…… 其实电脑开机后物理内存的每个字节中都有值且都是可读写的,从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页,一页通常为4KB。
zll199191 2018-01-08
  • 打赏
  • 举报
回复
编译不报错是因为没有语法错误,输出有错是因为变量已经在内存中被释放了,所以不是你你想要的值
「已注销」 2017-12-27
  • 打赏
  • 举报
回复
a没有引用,只是值拷贝,所以值是正确的。b发生了引用,因为是局部变量,所以返回出来的时候此变量已经销毁了,-2应该是一个随机值,没有什么意义
真相重于对错 2017-12-27
  • 打赏
  • 举报
回复
引用 2 楼 liang623392 的回复:
关键是编译器没报错啊,每次运行的结果还是一致的,我知道不能返回局部引用,我想知道的是为什么会有这个结果。
只知其然,不知其所以然!
腰刀首帕从军 2017-12-27
  • 打赏
  • 举报
回复
关键是编译器没报错啊,每次运行的结果还是一致的,我知道不能返回局部引用,我想知道的是为什么会有这个结果。
「已注销」 2017-12-27
  • 打赏
  • 举报
回复
局部变量是放在栈区的,所谓的销毁,其实是重复利用的问题,如果不去覆盖他,输出的还是原来的值3 int main() { int a = g(); int& b = g(); printf("b = %d\n", b); system("pause"); return 0; } 你也可以 在他们之间加一个函数 int& f() { int c = 9; return c; } 然后 int main() { int a = g(); int& b = g(); f(); printf("b = %d\n", b); system("pause"); return 0; } 这个输出值应该是9, 因为在int& b = g();之后函数f()调用中的局部变量是9,覆盖g()中的局部变量,即b
腰刀首帕从军 2017-12-27
  • 打赏
  • 举报
回复
运行了无数次b都是-2啊,vs上,codeblock上都是-2,谁能解释
真相重于对错 2017-12-26
  • 打赏
  • 举报
回复
引用相当于别名 你返回了局部变量的引用 所以出错 至于为何出,请百度

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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