资料合集下载链接:
https://pan.quark.cn/s/472bbdfcd014
在编程世界里,有些错误就像是隐藏在代码里的“定时炸弹”,平时可能相安无事,但在某个不经意的时刻就会引爆,导致程序崩溃或出现无法解释的诡异行为。今天,我们要拆解的,就是这样一个极具迷惑性又极其危险的炸弹——从函数中返回一个局部变量的地址。
这篇博客将带你深入理解为什么这个操作是绝对禁止的,以及它会如何“污染”你的程序。
问题的根源:栈(Stack)内存的“阅后即焚”特性
在深入案例之前,我们必须快速回顾一下**栈区(Stack)**的特性。
当一个函数被调用时,系统会在栈上为它开辟一块专属的内存空间,我们称之为“栈帧”(Stack Frame)。这块空间用来存放函数的所有局部变量、函数参数等。
栈最重要的一个特点就是自动管理和生命周期短暂:
- • 函数调用时:栈帧被创建,局部变量诞生。
- • 函数返回时:栈帧被销毁,其中所有的局部变量都会被立即释放。
这就像一块“阅后即焚”的黑板。函数在上面写写画画,一旦函数结束,这块黑板就会被立刻擦得干干净净,以便下一个函数使用。
如果你试图返回一个局部变量的地址,就相当于在黑板擦干净后,还想根据一个旧的地址去找上面写过的内容。这显然是行不通的,而且非常危险。
现在,让我们通过两个案例,看看危险是如何发生的。
案例一:返回一个局部整型变量的地址
我们先从一个最简单的例子开始。我们创建一个函数 create