在 C/C++ 中,局部变量的内存能否在其作用域之外访问?


让我们来看一个你可能能够在作用域之外访问局部变量内存的例子。

示例

#include<iostream>
int* foo() {
   int x = 3;
   return &x;
}

int main() {
   int* address = foo();
   cout << *address;
   *address = 12;
   cout << *address;
}

输出

这可能会给出以下输出:

3
12

正如我之前提到的,这段代码_可能_有效。我们只是读取和写入曾经是 x 地址的内存。在 main 函数中,你位于 foo 函数的作用域之外,该地址是指向某个随机内存区域的指针。在上面的例子中,该内存区域确实存在,并且目前没有任何其他内容正在使用它。你继续使用它不会破坏任何东西(你不会使用其他进程的内存区域或任何其他未经授权的内存区域),并且没有任何其他内容已覆盖它。因此,3 仍然在那里。

在一个真实的程序中,该内存可能几乎立即被重新使用,并且你可能会因为做这样的事情而破坏某些东西。这种内存访问错误很难追踪和解决。

当你从 foo 函数返回时,程序会告诉操作系统 x 的内存不再被使用,并且可以将其重新分配给其他内容。如果你很幸运,它被重新分配了,并且操作系统没有发现你再次使用它,那么你就可以逃脱惩罚。

更新于:2020年2月11日

浏览量:146

启动你的职业生涯

通过完成课程获得认证

开始学习
广告