c语言学习笔记-内存02
- 栈
特性
1. 自动分配
2. 脏内存
3. 反复使用
4. 临时性 - 堆
在有操作系统的平台上面,堆由对内存管理器管理
特性- 主动申请
- 脏内存
- 需要释放
- 临时性
- 大块内存
使用流程
申请-检查是否申请成功-存入数据-释放
使用这段内存空间前,最好先用memset将内存清一下零再使用
在使用堆内存的过程中,一定不要丢掉申请的内存指针,否则这块内存得不到释放,就会发生内存泄漏
堆中的内存是按块分配的,在gcc中,最小可申请的空间是16字节,而且在c语言中,越界使用堆内存是不会报错的,除非申请的空间超过堆栈空间,编译器才会报错
-
静态存储区
静态存储区是由代码段(.text),数据段(.data)和bss段构成的
编译器在编译可执行文件的过程中,将程序分为可可执行的代码和数据
代码段内存储的就是可执行的代码,也可以理解为函数的集合
数据段和bss段存储的都是数据,也就是全局变量和静态局部变量,两者区别在于,数据段存储的是显式初始化为非零值的全局变量和静态局部变量
bss段存储的是未显式初始化和显式初始化为零的全局变量和静态局部变量
同时需要注意的是,在全局变量中定义的字符串和某些编译环境下被const关键字修饰的变量,也会被编译器加入到代码段中,所以在程序中是无法更改他们的,但是在gcc中,const关键字只会通过编译器检查是否有被更改,变量还是放在数据段的 -
总结
以上几种内存方式中,栈和代码段,数据段的操作都不是开发者能主动分配的,只有堆内存是可以自由使用的
堆的使用很大程度上可以替换数据段的使用,只是二者生命周期不同,数据段的生命是贯穿程序运行始终的,而堆则是从开辟到释放