2010-04-20 58 views
4
void someFunc() 
{ 
    int stackInt = 4; 

    someOtherFunc(&stackInt); 
} 

难道someFunc结束后,使其不安全假定传递到someOtherFunc值代表具有值4的stackInt可变stackInt的地址空间可以被重新分配的情况下被传递给它?换句话说,我应该避免周围路过堆栈变量的地址,并期待他们仍然是他们已经结束了初始化功能后还活着吗?C堆栈/范围,功能后变量的寿命结束

+0

有人纠正我,如果我错了,不过,是不是安全的'stackInt'的地址传递给'someOtherFunc'?只有在someFunc返回后才会重新分配空间 - 只有在返回someOtherFunc后才会发生这种情况。问题只是返回堆栈变量的地址。因此,如果你从'someFunc'返回'&stackInt',你就会招来麻烦 - 否则你是安全的。 – Amarghosh 2010-04-20 06:30:18

+0

你大体上是对的,但你可以想象代码在哪里someOtherFunc松开那个指针(例如一个全局变量),这样即使在someOtherFunc返回后也有一个引用。这是你遇到问题的地方。 – nall 2010-04-20 07:10:59

+0

@nall谢谢你:) – Amarghosh 2010-04-20 12:13:22

回答

3

是的,当然。

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

1

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

所以,虽然它是细而无法通过地址(所以,例如someOtherFunc()可以修改的stackInt的值,如果有在someFunc()呼叫后访问它的代码通过周围堆栈变量,该值可能不是4仍然),它是不安全的存储指针,并期望它指向任何地方后someFunc()回报有效。

0
  1. 这是绝对精细传递堆栈变量作为参数所有可能的方式,只有当宣布这些变量的函数执行完成
  2. 堆栈分配的变量将被覆盖。

所以,直到你从someFunc()返回,没有伤害stackInt。

0

只要你不产卵从someOtherFunc新的线程,并使用stackInt那里,这会工作。