【问题标题】:C stack/scope, variable's lifetime after functions endsC堆栈/范围,函数结束后的变量生命周期
【发布时间】:2011-02-10 00:10:36
【问题描述】:
void someFunc()
{
    int stackInt = 4;

    someOtherFunc(&stackInt);
}

stackInt 的地址空间是否可以在 someFunc 结束后重新分配,从而假设传递给 someOtherFunc 的值代表传递给它的值为 4 的 stackInt 变量是不安全的?换句话说,我是否应该避免通过地址传递堆栈变量并期望它们在初始化它们的函数结束后仍然存在?

【问题讨论】:

  • 如果我错了,请有人纠正我,但是将stackInt 的地址传递给someOtherFunc 不安全吗?只有在 someFunc 返回后才会重新分配空间 - 这仅在 someOtherFunc 返回后才会发生。问题仅在于返回堆栈变量的地址。因此,如果你从someFunc 返回&stackInt,你就是在招惹麻烦——否则你是安全的。
  • 您通常是对的,但您可以想象 someOtherFunc 将指针隐藏在某处(例如全局变量)的代码,这样即使在 someOtherFunc 返回后也有对它的引用。这就是你遇到问题的地方。
  • @nall 谢谢你:)

标签: c stack


【解决方案1】:

是的,当然。

您不必完全避免通过引用/指针传递堆栈分配的变量,只需存储指针或对堆栈分配的变量的引用。

【讨论】:

    【解决方案2】:

    someFunc() 返回并调用另一个函数后,用于stackInt 的空间将用于新函数中的其他变量。因此,函数someOtherFunc() 不能安全地假设如果它保留了它所传递的指针的副本,则该指针将保持有效。如果它存储了指向的值的副本,那很好。

    因此,虽然可以通过地址传递堆栈变量(例如,someOtherFunc() 可以修改 stackInt 的值,并且如果 someFunc() 中有代码在调用后访问它,则value 可能仍然不是 4),存储指针并期望它指向 someFunc() 返回后的任何有效位置是不安全的。

    【讨论】:

      【解决方案3】:
      1. 以所有可能的方式将堆栈变量作为参数传递是绝对没问题的
      2. 堆栈分配的变量只有在声明这些变量的函数完成执行后才会被覆盖。

      所以在你从 someFunc() 返回之前,stackInt 是没有害处的。

      【讨论】:

        【解决方案4】:

        只要您不从 someOtherFunc 生成新线程并在那里使用 stackInt,这将起作用。

        【讨论】:

          猜你喜欢
          • 2013-08-07
          • 2012-06-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-11-08
          • 2013-05-01
          • 1970-01-01
          • 2012-11-05
          相关资源
          最近更新 更多