0

假设我们有以下代码。st 是一个全局堆栈,并已正确初始化。我们调用 foo()

struct stack *st;

int foo() {
    int x = 1;
    stack_push(st, &x);
}

现在,堆栈包含一个指向 x 的指针。在 foo 超出范围后,地址 &x 会发生什么?是否已解除分配?我们可以相信,当我们稍后 pop() 堆栈并取消引用它时,该值将是 1?

编辑:这是我目前的想法。由于 x 是在堆栈上分配的,一旦超出范围,任何人都可以使用地址 &x 中占用的内存,因此稍后 pop() 返回的取消引用值可能不是 1。

4

2 回答 2

2

返回点的行为foo是未定义的。通常,该值将一直保持到下一个方法调用创建足够大的堆栈来覆盖它。但依赖于此是错误的,不应该这样做。

如果你需要x活得更长,foo你需要在堆上为它分配内存

于 2013-03-08T05:48:23.940 回答
0

全局堆栈一直持有指向 x 的指针,直到全局堆栈被销毁。但是 foo 超出范围后,x 之前占用的堆栈空间可以被重用。可能是由于 foo() 重新进入,或其他函数调用,或任何其他堆栈空间分配引起的。

于 2013-03-08T06:41:48.947 回答