假设我们有以下代码。 st是一个全局堆栈并正确初始化。我们称之为foo()
struct stack *st;
int foo() {
int x = 1;
stack_push(st, &x);
}
现在,堆栈包含一个指向x的指针。 foo超出范围后,地址& x会发生什么?是否已取消分配?我们可以相信,当我们稍后弹出()堆栈并取消引用它时,该值将为1吗?
编辑:这就是我目前的想法。由于x在堆栈上分配,一旦超出范围,任何人都可以使用地址& x中占用的内存,因此稍后pop()返回的解引用值可能不是1.
答案 0 :(得分:2)
foo
点返回的行为未定义。通常,值将保持不变,直到下一个方法调用创建足够大的堆栈来覆盖它。但取决于这是错误的,不应该这样做。
如果您需要x
的寿命超过foo
,那么您需要在堆上为它分配内存
答案 1 :(得分:0)
全局堆栈始终将指针指向x,直到全局堆栈被销毁。但是在foo超出范围之后,x之前占用的堆栈空间可以重用。可能是由foo()重新输入,或其他函数调用或任何其他堆栈空间分配引起的。