C堆栈/范围,函数结束后变量的生命周期

时间:2010-04-20 06:20:57

标签: c stack

void someFunc()
{
    int stackInt = 4;

    someOtherFunc(&stackInt);
}

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

4 个答案:

答案 0 :(得分:3)

是的,当然。

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

答案 1 :(得分:1)

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

所以,尽管按地址传递堆栈变量是好的(例如,someOtherFunc()可以修改stackInt的值,如果someFunc()中有代码访问的话它在调用之后,值可能不是4),存储指针并指望它在someFunc()返回后指向任何有效位置是不安全的。

答案 2 :(得分:0)

  1. 将堆栈变量作为参数以各种可能的方式传递是绝对正确的
  2. 仅当声明这些变量的函数完成执行时,才会覆盖堆栈分配的变量。
  3. 因此,在从someFunc()返回之前,对stackInt没有任何影响。

答案 3 :(得分:0)

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