在C副作用中存储指向局部变量地址的指针

时间:2013-03-08 05:45:37

标签: c

假设我们有以下代码。 st是一个全局堆栈并正确初始化。我们称之为foo()

struct stack *st;

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

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

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

2 个答案:

答案 0 :(得分:2)

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

如果您需要x的寿命超过foo,那么您需要在堆上为它分配内存

答案 1 :(得分:0)

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