看林锐的<>有疑问

femalelover 2006-09-26 05:13:48
书写得很流畅,看起来也轻松,不过在基础上10.3一节里, 老林的意思好像在说"返回局部对象是合法的". 而只有返回栈上的指和引用才会有问题.
比如,照他的意思,下面的代码天经地义:

#include<iostream>
using namespace std;

int test(void)
{
int a = 100;
return a; //返回局部对象的值
}

void main(void)
{
int b = test();
cout << b <<endl;
}
上面的代码不管是Debug还是Release版本,都不会有问题,我做了个MFC版本,也没有问题,但明明记得说不能返回局部变量的呀. 困惑了..
...全文
3262 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
pdfMaker 2006-09-28
  • 打赏
  • 举报
回复
因为你执行函数完了之后就退出,那么你刚才给赋的一些值还是在的,不会自动地初始化栈里的所有内存。
因此说你上面的那个栈里的内容还没变,值自然还是100.
编程下面这样,你的值就变成10了。
#include<iostream>
using namespace std;

int * test(void)
{

int a = 100;
return &a; //返回局部对象的值
}

int test1(void)
{

int a = 10;
return a; //返回局部对象的值
}

void main(void)
{

int *b = test();
int b1 = test1();
cout << *b <<endl;
}

因为被后面那个函数中的变量冲掉了。
jxfengzi 2006-09-27
  • 打赏
  • 举报
回复
up
suhanzhong 2006-09-27
  • 打赏
  • 举报
回复
对了
femalelover 2006-09-27
  • 打赏
  • 举报
回复
dead_of_winter 说对了一半,返回简单类型如int时,会被塞入寄存器, 返回复杂类型如class时,会被压栈处理.

楼下的认为我说的对吗?
zteclx 2006-09-27
  • 打赏
  • 举报
回复
该书应该归入散文或小说一类,没有太大价值。
cool2635 2006-09-27
  • 打赏
  • 举报
回复
Honey123()
你的那个程序我运行了一下,确实是100,不过这样应该是很危险的。
我试着把你的mian()稍微改了一下
void main(void)
{
int d;
int *b = test();
cout << *b <<endl;
cout << *b <<endl;
cin>>d; //纯粹是为了让结果不马上消失,无意义
}
结果是
100 //cout << *b <<endl;
124503 //cout << *b <<endl;
2 //cin>>d;
可以看到在第一个cout执行后,b所指的地址就成了野地址了,不知道是不是test里a的值并不是在test执行完后马上释放,而是要置后一点,不明白,请求高人解答。
flyinf_guo 2006-09-27
  • 打赏
  • 举报
回复
关注,学习
TangJianQiang 2006-09-27
  • 打赏
  • 举报
回复
上面这个不是叫返回局部变量,而且在返回的过程中创建一个中间变量,在将这个变量的值用赋值函数赋值到接收的值那里,你先看看Effective C++和More Effective C++
weisuxian 2006-09-27
  • 打赏
  • 举报
回复
有人在吗?
weisuxian 2006-09-27
  • 打赏
  • 举报
回复
帮帮忙``我想问您们一下,电子表格.像这样`9月20日-9月30日.这样`怎么样能自动算出天数来.有什么公式???????告诉我好吗?
daotong 2006-09-27
  • 打赏
  • 举报
回复
楼上的楼上,本来就是100,没什么好奇怪的哦
wanglovec 2006-09-27
  • 打赏
  • 举报
回复
就应该是100 呀
Honey123 2006-09-27
  • 打赏
  • 举报
回复
#include<iostream>
using namespace std;

int * test(void)
{

int a = 100;
return &a; //返回局部对象的值
}

void main(void)
{

int *b = test();
cout << *b <<endl;
}

但输出100了, 我就纳闷了 不知道为什么了
pottichu 2006-09-26
  • 打赏
  • 举报
回复
不要返回局部变量的指针或者引用。。。。
dead_of_winter 2006-09-26
  • 打赏
  • 举报
回复
据说函数返回值实际就是函数结束时eax寄存器中的值
所以如果他是个指针 不可能指向你想要的值
飞哥 2006-09-26
  • 打赏
  • 举报
回复
返回的是值!

如果返回的是地址就有问题
因为在栈上分配的空间,函数退出,空间释放,你再用地址去访问空间,都已经释放了,肯定找不到了
所以,就这个意思

当然你也可以在对上分配空间,这样它就不会去释放,然后你返回之后再自行释放


lz是不是啊:)
OOPhaisky 2006-09-26
  • 打赏
  • 举报
回复
int test(void)
{
int a = 100;
return a; //返回局部对象的值
}
-----------------------------------------------------------
这肯定不会有问题,因为你是“by value”方式返回的。
像下面这样:
int* test(void)
{
int a = 100;
return &a; //返回局部对象的地址
}
才是危险的,因为函数返回后,a已经不复存在,所以那个指针所指向的东西是没有意义的。但是,这段函数在语法上是合法的,就编译器会顺利通过编译(无论debug还是release)。所以这样的潜在bug只能靠程序员自己注意才行,编译器帮不上忙的。
hai1039 2006-09-26
  • 打赏
  • 举报
回复
有一章讨论的是类
taodm 2006-09-26
  • 打赏
  • 举报
回复
林锐的书,挂着C++头衔,没看见有和C++有关的内容。
lj860603 2006-09-26
  • 打赏
  • 举报
回复
是不可以返回局部变量的地址。
你这个程序没有问题,返回的是局部变量值的副本,没有问题。
如果改成返回&a就有问题啦``
加载更多回复(1)

64,685

社区成员

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

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