函数返回后本地内存地址是否有效?

时间:2011-08-18 23:00:42

标签: c memory memory-management

  

可能重复:
  Can a local variable's memory be accessed outside its scope?

我清楚了解内存如何运作的知识,我面临着困惑。这是示例代码

int * func(){
   int retval = 3;
   return &retval;
}

int main(void){
   int *ptr = func();
   printf("address return from function %p and value %d\n", ptr, *ptr);
}

我的理解是关于堆栈内存如何在例程上工作,当一个函数被调用时,它被推入堆栈。一旦函数返回,此例程中的局部变量的生命周期将不再有效。因此返回局部变量的地址似乎无效,但是当我测试这段代码时,它实际上返回了它的地址,并且在函数返回后仍然有效。

我是否误解了这个概念?感谢任何评论,谢谢。

1 个答案:

答案 0 :(得分:3)

“测试代码”并不是确定某些内容是否有效的有意义方法。您的代码会产生未定义的行为。未定义行为的一种可能表现是代码可能看起来“正常”。换句话说,你很幸运。

回答这个问题:不,返回指向局部变量的指针是无效的,取消引用这样的指针是无效的。任何这样做的尝试都会导致未定义的行为。