什么是堆?什么是栈?C/C++ 程序员必须搞清楚的概念
“堆"和"栈"在 C/C++ 中有两个不同层面的含义:数据结构层面和系统内存管理层面。初学者经常混淆,本文从两个角度分别说清楚。 一、数据结构层面 栈(Stack) 堆(Heap) 规则 后进先出(LIFO) 满足堆性质的完全二叉树(最大堆/最小堆) 用途 函数调用栈、表达式求值、DFS 堆排序、优先队列 实现 顺序栈或链式栈 数组(通常) 这是数据结构课程中的概念,与内存管理无关。 二、系统内存管理层面 这是 C/C++ 编程中更常见的语境。 程序的内存布局 一个 C/C++ 程序的内存分为以下区域: 高地址 ┌─────────────────┐ │ 栈区(stack) │ ← 向低地址增长 │ ↓ │ │ │ │ (空闲空间) │ │ │ │ ↑ │ │ 堆区(heap) │ ← 向高地址增长 ├─────────────────┤ │ 全局/静态区 │ 全局变量、static 变量 ├─────────────────┤ │ 常量区 │ 字符串常量、const 常量 ├─────────────────┤ │ 代码区 │ 函数体的机器指令 └─────────────────┘ 低地址 栈(Stack) 由系统自动管理,用于存放函数参数、局部变量、返回地址等。 ...