内存被分成五个区栈、堆、静态存储区、常量区、代码区。C 的内存管理是其最强大但也最复杂的特性之一。它赋予了程序员对硬件的极致控制权但也要求程序员承担起精确管理的责任。现代 C 的内存管理哲学已经从手动管理转向了自动化和智能化核心思想是RAII。C 内存五大分区详解我们可以把程序的内存想象成一栋大楼不同的区域住着不同的“住户”1. 栈区住户局部变量、函数参数、返回值。特点自动管理由编译器自动分配和释放无需人工干预。速度快分配方式类似于数据结构中的“栈”先进后出只是移动栈顶指针效率极高。空间小大小有限通常由操作系统限制如 2MB如果分配过大如超大数组或递归过深会导致栈溢出。注意不要返回局部变量的地址因为函数结束时该内存会被立即回收。2. 堆区住户动态分配的内存new/malloc出来的对象。特点手动管理必须由程序员手动分配new和释放delete。如果忘了释放就会产生内存泄漏。空间大受限于计算机系统的虚拟内存空间非常充裕。速度较慢分配时需要寻找合适的空闲内存块容易产生内存碎片。现代 C 建议尽量使用智能指针如std::unique_ptr,std::shared_ptr来自动管理堆内存避免手动delete。3. 静态存储区住户全局变量、静态变量static。细分已初始化数据段 (.data)存放已初始化的全局/静态变量如int a 10;。未初始化数据段 (.bss)存放未初始化或初始化为 0 的全局/静态变量如int b;系统会自动置零。特点生命周期贯穿整个程序运行期间程序启动时分配结束时由系统释放。4. 常量区住户常量数据如字符串字面量Hello、const修饰的全局常量。特点只读这部分内存是只读的试图修改会导致程序崩溃段错误。共享相同的字符串常量在内存中通常只存一份。注意const修饰的局部变量通常存放在栈区而不是常量区。5. 代码区住户编译后的二进制机器指令函数体代码。特点只读防止程序意外修改自身的指令。共享如果同一个程序运行多次操作系统可能让这些实例共享同一份代码区。核心对比栈 vs 堆对比项栈堆管理方式编译器自动管理程序员手动控制 (new/delete)分配效率极高指针移动较低需查找空闲链表易碎片化空间大小较小容易溢出很大受限于虚拟内存生长方向向低地址增长向下向高地址增长向上生命周期随函数作用域结束而释放从分配直到手动释放代码演示#include iostream #include cstring // 1. 全局变量 - 静态存储区 (.data) int g_var 10; // 2. 未初始化全局变量 - 静态存储区 (.bss) int g_uninit_var; // 3. 常量 - 常量区 const char* str_const Hello Memory; void testFunc(int param) { // param - 栈区 // 4. 局部变量 - 栈区 int local_var 20; // 5. 静态局部变量 - 静态存储区 (.data) static int s_var 30; // 6. 动态分配 - 堆区 int* heap_ptr new int(40); std::cout 内存地址演示 std::endl; std::cout 全局变量 (静态区): g_var std::endl; std::cout 静态局部 (静态区): s_var std::endl; std::cout 字符串常量 (常量区): (void*)str_const std::endl; // 打印字符串内容的地址 std::cout 函数参数 (栈区): param std::endl; std::cout 局部变量 (栈区): local_var std::endl; std::cout 堆内存 (堆区): heap_ptr std::endl; std::cout 函数代码 (代码区): (void*)testFunc std::endl; delete heap_ptr; // 记得释放堆内存 } int main() { testFunc(100); return 0; }