12.1.3 *返回指针的函数(指针函数),以及使用全局变量的tips

我们回到指针当时讲过的这件事情,如果有一个函数,你要让他返回一个指针的,那么如果你返回的是一个本地变量的地址,这是危险的.因为一旦离开这个函数,这个本地变量就不存在了,我们可以来试一下:

我们现在做的事情是这样的,我们有两个函数,f和g,f函数会返回一个指向int的指针,我们有一个变量int i=12,我们让它返回i的指针.我们在main里面把f返回的指针交给了*p,然后我们来检查一下*p所指的那个地方的整数是多少.显然我们期待它会得到12.然后我们又去调用了g函数,g函数里面有一个另外的变量k=24,我们打印一下k.g函数调用完了以后,我们再来访问p所知的那个地方的值,你还能期望得到12吗?我们来试一下:

当然前面我们会有warning,这个warning告诉你说,把这个堆栈里面的本地变量的地址返回出去的话,这是有问题的,我们不管这个warning,先继续运行来看一下结果.我们得到的结果说,首先是*p=12,我们从f那里得到了,嗯,表面看起来没有问题嘛.不过,i不是本地变量吗,你不是说本地变量离开了函数以后呃这个变量就不存在了吗,为什么还是能够得到12?嗯...不存在是说,它不再受控了,不是说它就不再在那里了(好像和之前课上说的冲突了?),没有人能保证这个12所在的那个地方,还能够继续保持12这个值,但是不等于没有人保证说,他一定不在那里了.这是两个逻辑上不同的概念.然后调用g函数得到k=24,然后第二句printf输出*p=24.我们在这个过程当中没有任何人对*p做任何事情,也没有人对i做任何事情,但是p所指的那个地方就变成24了.

实际上我们可以再试一件事情:在f函数打印i的地址,再在g函数打印k的地址,我们会发现得到的结果是一样的.

所以返回一个本地变量的地址,让外面的程序继续去使用它,这件事情是有风险的,因为这个函数结束以后,那个本地变量的地址会继续被分配给别人继续去使用.这房子都收回去了,业主把他租给别人了,你还留着那把钥匙有什么用.但是如果你返回的是全局变量或者静态本地变量的地址,那是安全的,因为这两者的地址和函数没有关系,它们是全局生存期的,那如果你返回在函数里面malloc的内存当然是安全的,但是呢这容易造成问题.

(本地变量就像是一个租来的房子。函数(房东)在执行时,暂时“租”了这个房间(即在栈上分配内存)。函数结束后,房东“收回”了这个房间的控制权,但你(指针)还持有房间的钥匙。然而,房东可能已经把房间“租”给了其他人(新的数据或变量),所以你的钥匙变成了“无效的钥匙”。用这把钥匙去访问房间就会导致不安全的情况。

全局变量或静态变量则不同,它们更像是你自己拥有的房子。不管函数运行到哪里,这个“房子”(变量)始终归你所有,钥匙也不会失效,所以访问它是安全的。

malloc分配的内存可以理解成“自己买了一个房子”,函数结束后房子依然存在,钥匙也不会失效。只是这里的风险在于,虽然你“买”了这个房子(分配了内存),但是如果忘记释放(忘记归还房子),会造成内存浪费(内存泄漏))


这件事情我们整页都打了星号,所以我们就不展开去讲了.

2.全局变量的tips

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值