【C语言】复习~动态内存管理
如果你已经对C语言略知一二,现在正在复习C语言的一些重点知识
-------------------------------------------------------------------------------------------------------------------------
关注我🌈,每天更新总结文章(多以图文形式,方便记忆,均为网上搜集资料以及AI)⭐
-------------------------------------------------------------------------------------------------------------------------
时间:2025/5/22/15:30分
-----------------------------------
快来参与讨论💬,点赞👍、收藏⭐、分享📤,共创活力社区
目录
动态内存管理
1.为什么存在动态内存分配
2.动态内存函数的介绍
mallo
free
calloc
realloc
3.常见的动态内存错误
4.几个经典的笔试题
5.内存空间 | 栈和堆
1.为什么存在动态内存分配(关于内存空间 | 栈和堆 在后面会讲)
- 我们最基础掌握的内存开辟方式有
- 但是上述的空间开辟方式有两个特点
2.动态内存函数的介绍
malloc
free
calloc
realloc
3.常见的动态内存错误
4.几个经典的笔试题
5.内存空间 | 栈和堆
程序内存
├─ **代码段(Text Segment/Code Segment)**
│ ├─ 存储编译后的可执行代码(机器指令)
│ ├─ 只读属性(防止程序意外修改代码)
│ └─ 共享属性(多个进程可共享同一代码段)
├─ **数据段(Data Segment)**
│ ├─ **初始化数据段(Initialized Data Segment)**
│ │ ├─ 存储已初始化的全局变量和静态变量
│ │ ├─ 分为:
│ │ │ ├─ 只读数据(如 `const` 全局变量,通常单独存放于只读数据段)
│ │ │ └─ 可写数据(如普通全局变量)
│ └─ **未初始化数据段(BSS Segment)**
│ ├─ 存储未初始化的全局变量和静态变量
│ ├─ 程序加载时自动初始化为 0 或空指针
│ └─ 不占用可执行文件空间(仅记录变量名称和大小)
├─ **堆(Heap)**
│ ├─ 动态内存分配区域(运行时通过 `malloc/new` 申请)
│ ├─ 由程序员手动管理分配和释放(需避免内存泄漏)
│ └─ 内存分配方向:从低地址向高地址增长
├─ **栈(Stack)**
│ ├─ 存储函数调用栈帧(局部变量、函数参数、返回地址等)
│ ├─ 由编译器自动管理(函数调用/返回时自动分配/释放)
│ └─ 内存分配方向:从高地址向低地址增长
├─ **只读数据段(Read-Only Data Segment)**
│ ├─ 存储只读数据(如 `const` 全局变量、字符串字面量)
│ └─ 程序运行时不可修改
└─ **其他特殊段(可选)**
├─ 符号表(Symbol Table):存储符号信息(调试用)
├─ 重定位表(Relocation Table):程序加载时地址修正
└─ 动态链接段(Dynamic Link Segment):存储动态链接信息
- 关于static(变为静态变量)
- 加了static的全局变量只能在本文件内使用
- 加了static的局部变量只会初始化一次,值为上次函数调用更改的值,生命周期跟随程序
- 全局变量和静态变量在编译阶段就分配内存了 存在静态存储区