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