上一篇下一篇C/C 中 sizeof 和 strlen 的区别栈和堆的区别内存分配方式栈由系统自动分配和释放。函数调用时局部变量、函数参数等会自动压入栈函数返回时这些数据自动弹出并释放。堆由程序员手动申请和释放如 C/C 中使用malloc/free或new/delete。若不手动释放可能造成内存泄漏。内存管理栈遵循“后进先出”LIFO原则结构简单管理高效。堆内存分配自由可以动态申请任意大小的内存块但管理复杂容易产生碎片。生命周期栈变量的生命周期与作用域绑定离开作用域即被销毁。堆变量生命周期由程序员控制直到显式释放或程序结束。访问速度栈访问速度快因为内存连续且由硬件支持如寄存器指针直接操作。堆访问速度相对较慢涉及指针间接寻址且可能触发操作系统内存管理机制。空间大小栈通常较小例如几 MB受操作系统限制容易发生栈溢出如递归过深。堆空间较大受限于虚拟内存适合存储大对象或长期存在的数据。用途示例栈存储函数局部变量、返回地址、参数等。堆存储动态数据结构如链表、树、大数组、需要跨函数/模块共享的数据。线程安全性栈每个线程有自己的栈天然线程安全。堆多个线程共享堆需加锁等同步机制避免竞争条件。总结对比表特性栈Stack堆Heap分配方式自动系统管理手动程序员管理生命周期作用域结束自动释放手动释放或程序结束访问速度快较慢内存大小小有限大受限于虚拟内存碎片问题无可能存在典型用途局部变量、函数调用动态分配、大对象、共享数据线程安全是每个线程独立栈否需同步机制