[转]在函数外存取局部变量的一个比喻
来源:互联网 发布:java 年月日拆分 编辑:程序博客网 时间:2024/04/30 10:50
原文出处:http://coolshell.cn/articles/4907.html
在函数外存取局部变量的一个比喻 作者:2011年6月28日
在StackOverflow上一这样一个关于C/C++的问题,问问题的人给了一个代码如下:
int
* foo()
{
int
a = 5;
return
&a;
}
int
main()
{
int
* p = foo();
cout << *p;
*p = 8;
cout << *p;
}
你可以编译并运行这个代码(编译时会有一个Warning),结果是:5 8。看上去你可以存取一个函数内的局部变量。但这和我们理解的不一样——函数内的变量在函数退出时就被释放了,不应该在外部还可以被引用。当然,对于C/C++熟悉的人都知道其实并不是真正的释放,你依然还可以通过内存地址去进行操作,这是C/C++的内存管理的不安全性——指针可以用来乱指。
这个问题的解答是比较简单的,但是这个问题有一个答案中的比喻非常精彩。这个比喻是这样的——
你在某个酒店订了一个房,你入住的时候,你放了一本书在这个酒店的抽屉里,但是你走的时候,你忘了这本书。而且,你还没有把这个房间的钥匙还回去。于是,你在未来某个时候,偷偷地回来,打开这个房间的门,你看到了你的书还在里间。当然,还还可以放回别的书。因为,这个酒店管理不会在你走的时候把你留下的书清走,而且,这个酒店的管理的安保措施不是那么严格,因为他信任每一个客人都会遵守管理条例。
在这种情况下,如果你幸运的话,书还会在那里,也可能你的书已经没了。也有可能当你回去的时候,有一个人在那里正在撕你的书,或者酒店把那个抽屉都挪走并变成衣柜,或是整个酒店正在被拆除以改成了一个足球场,而你偷偷摸摸进到施工现场的时候被炸死。
真是很精彩的比喻。这就是C/C++的不安全的地方,也正是Linus说的,C++是一门恐怖的语言是因为有很多不合格的程序员在使用它。就像你看到小孩子玩火一样的恐怖。
关于这个事,还有一个比较经典的示例如下—— 函数a的初始化会影响函数b的数组。注意函数a中的 volatile
关键字。
#include <iostream>
using
namespace
std;
void
a()
{
volatile
int
array[10];
for
(
int
i = 0; i < 10; i++)
array[i] = i;
}
void
b()
{
int
array[10];
for
(
int
i = 0; i < 10; i++)
cout << array[i];
}
int
main()
{
a();
b();
}
真是可爱的C/C++。
- [转]在函数外存取局部变量的一个比喻
- 在函数外存取局部变量的一个比喻
- 在函数外存取局部变量的一个比喻
- C/C++:在函数外存取局部变量的一个比喻
- 关于C/C++: 在函数外存取局部变量问题( 精辟 )
- c语言:输出一个静态局部变量只在函数内部有效的例子
- 一个类成员函数的局部静态变量问题
- 全局变量与局部变量在函数传参时的应用
- C++ 局部变量的作用域 --- 以酒店房间为比喻说明
- 函数局部变量的返回
- 函数局部变量的返回
- 指针函数的局部变量
- 测试的一个比喻!
- 给函数和变量取一个有意义的名字
- 多线程都调用一个函数,在这个函数中的一个局部变量什么情况会被修改
- 有关static的全局变量、局部变量,全局函数、局部函数
- 遇到的一个面试题:编写一个strlen函数,不能使用全局变量或者局部变量
- 主函数调用子函数返回局部变量的问题及子函数的局部变量在函数结束后是否会销毁变量的内容
- 既然彼此不能相濡以沫, 那就相忘于江湖吧.
- Flex如此简单访问EJB
- Oracle10g Rac ora-12545
- HDU 3666 THE MATRIX PROBLEM 差分约束系统
- OSG使用更新回调来更改模型
- [转]在函数外存取局部变量的一个比喻
- RHEL Oracle10g 删除安装失败的cluster
- C++进阶必读书籍
- Android 如何建立AIDL
- Android 用手势切换activity
- Eclipse配置Struts2问题:ClassNotFoundException: org...dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
- Android AIDL远程服务使用示例
- ORA-00824: cannot set sga_target due to existing internal settings
- 周六 写的 横竖屏 字段 oritation 和 oritation/keyhidden 两个字段 对实现横竖屏的区别