在 C/C++ 中,局部变量的内存是否可以在其范围之外访问?

c++server side programmingprogramming

让我们看一个例子,您可能能够在其范围之外访问局部变量的内存。

示例

#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 的内存不再被使用,并且可以将其重新分配给其他内存。如果您很幸运并且它被重新分配,并且操作系统没有发现您再次使用它,那么您就可以摆脱它。


相关文章