C 语言从 0 入门(二十二)|内存四区:栈、堆、全局、常量区深度解析
大家好我是网域小星球。很多同学学到指针、动态内存、变量作用域时都会困惑为什么局部变量出函数就失效为什么malloc出来的内存要手动free为什么字符串常量不能改野指针、内存泄漏到底是怎么产生的答案都在内存四区里。这一章不讲花哨语法而是讲程序运行的底层原理搞懂它指针和内存相关的 BUG 你一眼就能看懂。目录一、本章学习目标二、程序内存四区概览三、栈区stack特点存放内容典型坑点四、堆区heap特点存放内容五、全局 / 静态区特点存放内容六、常量区 代码区特点存放内容七、四区一张表总结八、高频面试 BUG 原理九、本章核心总结下期预告一、本章学习目标认识 C 程序的四大内存区域栈区、堆区、全局 / 静态区、常量区知道每种变量存在哪里、生命周期多长理解栈与堆的区别彻底搞懂动态内存明白野指针、内存泄漏、常量不能修改的本质为后续写稳定、少 BUG 的程序打下底层基础二、程序内存四区概览程序运行时操作系统会给它分配一块内存主要分为 4 个区域栈区stack局部变量、函数形参由系统自动分配、自动释放。堆区heap动态内存malloc/calloc/realloc手动申请、手动释放。全局 / 静态区data segment全局变量、静态变量static程序整个运行期间都存在。常量区 / 代码区text rodata代码指令、字符串常量、const 常量只读不可修改。三、栈区stack特点由系统自动管理不需要手动申请释放空间小、分配速度快遵循后进先出函数结束时局部变量自动销毁存放内容函数内部的非静态局部变量函数参数函数返回地址示例void func() { int a 10; // 栈上 char arr[10]; // 栈上 } // 函数结束a 和 arr 自动被回收典型坑点返回栈内存地址int *func() { int a 10; return a; // 危险 }函数结束后a已经销毁返回的地址变成野指针。四、堆区heap特点手动申请malloc、手动释放free空间大、速度相对慢生命周期由程序员控制不主动释放会造成内存泄漏程序结束后由系统回收存放内容malloc / calloc / realloc申请的内存示例int *p (int*)malloc(4 * sizeof(int)); // 手动释放 free(p); p NULL; // 避免野指针五、全局 / 静态区特点程序运行期间一直存在默认初始化为 0作用域看定义位置存放内容全局变量函数外定义静态变量static修饰的变量示例int g_a 10; // 全局区 void func() { static int s_b 20; // 静态区 }static局部变量特点只初始化一次函数结束不销毁下次进函数值还在六、常量区 代码区特点只读不能修改修改会直接程序崩溃存放内容程序代码指令字符串常量const 修饰的全局常量典型坑点char *p hello; // hello 在常量区 p[0] H; // 崩溃但下面这个没问题因为在栈上char arr[] hello; arr[0] H; // 正常七、四区一张表总结区域存放内容生命周期管理方式读写栈区局部变量、形参函数内系统自动读写堆区malloc 内存手动控制手动 free读写全局区全局 / 静态变量整个程序系统自动读写常量区字符串、代码整个程序系统只读八、高频面试 BUG 原理野指针指向栈变量释放、堆内存已 free、未初始化的指针。内存泄漏malloc 后没有 free一直占着内存。程序崩溃修改常量区、越界访问、野指针解引用。static 作用改变生命周期不改变作用域。九、本章核心总结栈自动、临时、小空间堆手动、持久、大空间全局 / 静态全程存在、默认 0常量区只读不能改搞懂四区 搞懂内存生命周期 少写 90% 指针 BUG下期预告下一篇我们讲编译之前的预处理指令学会宏定义、文件包含、条件编译写更通用、跨平台的代码。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2517761.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!