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