Logo
Section 1 / 5

栈

了解栈及其在为函数分配内存中的作用。

导入

栈

了解栈及其在为函数分配内存中的作用。

到目前为止,我们已经学习了如何声明基本类型变量(如 int、double 等)以及复杂类型(如数组和结构体)。我们目前声明这些变量的方式是将它们存储在栈上。

什么是栈?

栈是计算机内存中一个特殊的区域,用于存储每个函数(包括 main 函数)创建的临时变量。栈是一种 后进先出(LIFO) 的数据结构,由 CPU 密切管理并高度优化。

每当一个函数声明一个新的变量时,该变量就会被“压入”栈中。而每当一个函数结束执行时,该函数所压入栈中的所有变量都会被释放(即被删除)。一旦栈上的变量被释放,其占用的内存区域就可被其他用途重新使用。

使用栈进行内存管理

使用栈来存储变量的优势在于,内存管理是自动完成的。我们无需手动分配内存,也不需要在不再使用时手动释放内存。

此外,由于 CPU 对栈内存的组织非常高效,因此读取和写入栈变量的速度非常快。

栈变量具有局部性

理解栈的关键在于:当一个函数退出时,其所有变量都会被移除或“弹出”栈(从而永久丢失)。因此,栈变量仅对该函数有效,具有局部性。

C 语言编程中的一个常见错误是尝试在函数外部(即函数已退出之后)访问某个函数内部创建的栈变量。我们稍后会看到这种情况是如何发生的。

局限性

需要注意的是,栈还有一个重要特性:操作系统对栈上可分配内存的大小有限制(具体限制因系统而异)。相比之下,堆上分配的内存则没有这种限制。接下来我们将介绍堆,它是 C 语言中另一种可用的内存结构。

总结一下我们关于栈的学习内容:

  • 随着函数的调用与返回,栈会动态增长和收缩;局部变量被压入和弹出栈。
  • 无需手动管理内存:变量会自动分配和释放。
  • 栈有大小限制。
  • 栈变量仅在其创建函数运行期间存在。

杂项

堆