为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用指针从不同的函数访问局部变量?

如何使用指针从不同的函数访问局部变量?

C++ C
泛舟湖上清波郎朗 2019-05-24 15:21:58
如何使用指针从不同的函数访问局部变量?我可以在不同的函数中访问局部变量吗?如果是这样,怎么样?void replaceNumberAndPrint(int array[3]) {     printf("%i\n", array[1]);     printf("%i\n", array[1]);}int * getArray() {     int myArray[3] = {4, 65, 23};     return myArray;}int main() {     replaceNumberAndPrint(getArray());}上面一段代码的输出:65 4202656我究竟做错了什么?“4202656”是什么意思?我是否必须在replaceNumberAndPrint()函数中复制整个数组才能比第一次更多地访问它?
查看完整描述

4 回答

?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

myArray是一个局部变量,因此指针只有在其范围结束时(在这种情况下是包含函数getArray)才有效。如果您以后访问它,您将获得未定义的行为。

在实践中,发生的是调用printf覆盖所使用的堆栈的部分,myArray然后它包含一些其他数据。

要修复代码,您需要在足够长的范围内声明数组(main示例中的函数)或在堆上分配它。如果在堆上分配它,则需要手动释放它,或者使用RAII在C ++中释放它。

我错过了一个替代方案(可能是这里最好的一个,只要数组不是太大)就是将数组包装成一个结构,从而使它成为一个值类型。然后返回它会创建一个在函数返回后幸存的副本。有关详细信息,请参阅tp1答案


查看完整回答
反对 回复 2019-05-24
?
智慧大石

TA贡献1946条经验 获得超3个赞

一旦超出范围,您就无法访问本地变量。这就是本地变量的含义。

在replaceNumberAndPrint函数中访问数组时,结果是未定义的。它似乎第一次工作的事实只是一个幸运的巧合。可能你指向的内存位置是在堆栈上未分配的,并且仍然为第一次调用正确设置,但是对printf的调用然后通过在操作期间将值推入堆栈来覆盖它,这就是为什么第二次调用printf会显示某些内容不同。

您需要将数组数据存储在堆上并传递指针,或传递到保留在范围内的变量(例如,全局或主函数内的某些范围)。


查看完整回答
反对 回复 2019-05-24
?
不负相思意

TA贡献1777条经验 获得超10个赞

一离开getArray,myArray就会超出范围。您需要在堆上为它分配空间。


查看完整回答
反对 回复 2019-05-24
  • 4 回答
  • 0 关注
  • 770 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信