C语言基础 内存管理
第十章 内存管理
./a.out运行起来后,系统会给a.out分配一段内存区域
1 code 存放编写好的c语言代码。只读特性,在运行期间不能修改。
2 data 数据段。存储全局变量,以及被static修改的变量。
细分:
data 数据段,有初值的全局变量和static变量
bss 未初始化的数据段。包含没有给初值的全局变量和static变量。
由系统负责初始化为0。
rodata 只读数据段。包含字符串常量。
3 heap 堆区。<2.9G程序在运行时,需要内存的时候,在堆中申请。相对堆空间比较大,可以自动增长。
如果需要空间,需要手动申请(malloc)。使用完毕后需要手动释放内存(free)。
申请内存后,没有释放的,那么这段空间一直存在,直到释放或程序关闭。由程序员决定生命周期。
4 共享区 只要存储,库函数的实现。比如,printf,scanf共享库(动态库文件)ldd ./a.out
5 栈区 (堆栈)8M内存空间自动申请和释放。局部变量,函数参数,返回地址。出了作用域,内存就会释放。
作用:
1 可以获得相对大的内存。
2 内存使用率提高
#include<stdlib.h> malloc 分配空间内存,参数是需要内存的大小。 返回值是分配到堆内存空间的地址。地址值需保留好,直到释放前。 释放堆内存空间,参数如要传入,当时malloc的返回值。这个值要和当时分配空间的地址值一致。 void free(void*ptr) 释放完后,ptr = NULL,不然ptr是野指针。也不要试图去访问原来的堆空间数据, 从逻辑上认为堆空间数据生命周期结束。3 内存的泄露
1 只申请堆内存空间不释放。系统内存空间枯竭,程序会异常退出。
2 当申请堆空间后,不小心,保存堆空间地址的指针,被覆盖了,那么原来报错的堆空间就丢失了。
