导入
栈
了解栈及其在为函数分配内存中的作用。
到目前为止,我们已经学习了如何声明基本类型变量(如 int、double 等)以及复杂类型(如数组和结构体)。我们目前声明这些变量的方式是将它们存储在栈上。
什么是栈?
栈是计算机内存中一个特殊的区域,用于存储每个函数(包括 main 函数)创建的临时变量。栈是一种 后进先出(LIFO) 的数据结构,由 CPU 密切管理并高度优化。
每当一个函数声明一个新的变量时,该变量就会被“压入”栈中。而每当一个函数结束执行时,该函数所压入栈中的所有变量都会被释放(即被删除)。一旦栈上的变量被释放,其占用的内存区域就可被其他用途重新使用。
使用栈进行内存管理
使用栈来存储变量的优势在于,内存管理是自动完成的。我们无需手动分配内存,也不需要在不再使用时手动释放内存。
此外,由于 CPU 对栈内存的组织非常高效,因此读取和写入栈变量的速度非常快。
栈变量具有局部性
理解栈的关键在于:当一个函数退出时,其所有变量都会被移除或“弹出”栈(从而永久丢失)。因此,栈变量仅对该函数有效,具有局部性。
C 语言编程中的一个常见错误是尝试在函数外部(即函数已退出之后)访问某个函数内部创建的栈变量。我们稍后会看到这种情况是如何发生的。
局限性
需要注意的是,栈还有一个重要特性:操作系统对栈上可分配内存的大小有限制(具体限制因系统而异)。相比之下,堆上分配的内存则没有这种限制。接下来我们将介绍堆,它是 C 语言中另一种可用的内存结构。
总结一下我们关于栈的学习内容:
- 随着函数的调用与返回,栈会动态增长和收缩;局部变量被压入和弹出栈。
- 无需手动管理内存:变量会自动分配和释放。
- 栈有大小限制。
- 栈变量仅在其创建函数运行期间存在。