局部变量的返回地址和程序仍然有效

Returning address of local variable and program still work

本文关键字:有效 程序 返回 地址 局部变量      更新时间:2023-10-16

假设这是我想要谈论的快照。在这段代码中,main函数调用'foo',返回局部声明变量'a'的地址。在我的印象中,局部声明的变量在超出作用域时将重新分配内存。变量'a'应该在调用foo之后取消分配,并且不应该留下任何与'a'相关的内容。但在这种情况下,它似乎打破了这个基本假设。下面发生了什么?

int* foo() {
  int a = 5;
  return &a;
}
int main() {
  int* p = foo();
  // Prints 5
  std::cout << "Coming from foo = " << *p << std::endl;
  *p = 8;
  // Prints 8
  std::cout << "Setting explicitly = " << *p << std::endl;
}

您的代码调用未定义行为。虽然它的名字很贴切,但它没有定义,这意味着您可能会得到预期的结果,也可能不会。你应该做的是不要依赖这样的结果,因为它们没有定义好。你可能会因为得到预期的结果而感到幸运,但相信我,这是一个陷阱!

这取决于你的机器/编译器打印什么值。堆栈的释放并不意味着之前在那里的东西被删除了。这就意味着这块区域已经失效了。这意味着当您尝试访问这些地址时,行为不能得到保证。在您的示例中,用于存储局部变量a的位置没有被覆盖。

相关文章: