2401_86971000 2024-09-13 21:00 采纳率: 0%
浏览 4

用地址做函数返回值也行??!!

img


为什么把函数里的局部变量地址做返回值照样能打印出来?虽然说会保留一次,但后面打印依旧如此,我为此做了三个数组,有一个数组刚好把那块内存包含了,但它的值依然不变是为什么?
有没有懂的能解释一下😭

  • 写回答

1条回答 默认 最新

  • 一轮明月照丘壑 2024-09-13 21:29
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    关于你的问题,我们可以从几个方面来解答:

    首先,确实可以把函数的局部变量的地址作为函数的返回值。但要注意这里涉及的是 C++ 的生命周期问题。函数内部定义的局部变量会在函数返回后被销毁(也即作用域结束),但如果此时我们返回了该局部变量的地址,这个地址实际上已经是一个悬空指针(dangling pointer)。它指向的内存已经被释放并可能被重新分配给其他的变量或用途。在这种情况下,尝试通过这个悬空指针访问内存是不安全的,因为它可能已经包含任意值或被操作系统用作其他用途。在某些情况下可能恰巧能得到期望的结果,但这完全依赖于操作系统和编译器的行为,不应该被依赖。这种行为是未定义行为(Undefined Behavior)。

    对于你提供的代码,函数 fan() 返回了局部变量 a 的地址。在 main() 函数中,你使用这个地址来访问 a 的值。第一次打印出 *b(即 a 的值)可能得到了期望的 10025,但后续再次访问这个地址可能得到不同的值,因为该地址指向的内存已经被重新分配了。即使你在 main() 函数中创建了数组 de 并打印它们的地址,它们与 a 的地址不同,所以这些数组并不会影响 fan() 函数返回的局部变量的地址的值。即使你的数组覆盖了相同的内存区域(这在不同的系统和编译器上可能会有不同的结果),你仍然不应该依赖这种行为来获取期望的结果。

    总的来说,返回局部变量的地址是不安全的做法,应该避免这样做。如果你需要在函数之间共享内存或数据结构,应该使用动态分配的内存(如使用 new 或智能指针)来管理它们的生命周期,或者设计数据结构来确保不会在返回之后删除或重新分配这些数据结构的内存。对于悬空指针的行为或生命周期的问题有更详细的解释和相关的问题出现你可以咨询专业人员意见进行指导帮助了解更深入哦~

    评论

报告相同问题?

问题事件

  • 创建了问题 9月13日

悬赏问题

  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见
  • ¥15 一共有五道问题关于整数幂的运算还有房间号码 还有网络密码的解答?(语言-python)
  • ¥20 sentry如何捕获上传Android ndk 崩溃
  • ¥15 在做logistic回归模型限制性立方条图时候,不能出完整图的困难
  • ¥15 G0系列单片机HAL库中景园gc9307液晶驱动芯片无法使用硬件SPI+DMA驱动,如何解决?