知识点回顾
1. C 语言的内存布局规律
可以看到局部变量的地址是占据高地,接着是 malloc 函数申请的动态内存空间,然后是全局变量和静态局部变量。
不过这两者都需要区分是否已经初始化,已经初始化的放一块,未初始化的放一块,并且未初始化的地址要比已经初始化的要更高一些。接着下来是字符串常量,最后是函数的地址。
2. 典型 C 语言程序的内存空间划分
根据内存地址从低到高分别划分为:
· 代码段(Text segment)
· 数据段(Initialized data segment)
· BSS段(Bss segment/Uninitialized data segment)
· 栈(Stack)
· 堆(Heap)
3. 代码段(Text segment)
代码段通常是指用来存放程序执行代码的一块内存区域。
这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读。
在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。
4. 数据段(Initialized data segment)
数据段通常用来存放已经初始化的全局变量和局部静态变量。
5. BSS段(Bss segment/Uninitialized data segment)
BSS 段通常是指用来存放程序中未初始化的全局变量的一块内存区域。
BSS 是英文 Block Started by Symbol 的简称,这个区段中的数据在程序运行前将被自动初始化为数字 0。
6. 堆
前边我们学习了动态内存管理函数,使用它们申请的内存空间就是分配在这个堆里边。
所以,堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩展或缩小。
当进程调用 malloc 等函数分配内存时,新分配的内存就被动态添加到堆上;当利用 free 等函数释放内存时,被释放的内存从堆中被剔除。
7. 栈
大家平时可能经常听到堆栈这个词,一般指的就是这个栈。
栈是函数执行的内存区域,通常和堆共享同一片区域。
8. 堆和栈的对比
堆和栈则是 C 语言运行时最重要的元素,下面我们将两者进行对比。
申请方式:
· 堆由程序员手动申请
· 栈由系统自动分配
释放方式:
· 堆由程序员手动释放
· 栈由系统自动释放
生存周期:
· 堆的生存周期由动态申请到程序员主动释放为止,不同函数之间均可自由访问
· 栈的生存周期由函数调用开始到函数返回时结束,函数之间的局部变量不能互相访问
发展方向:
· 堆和其它区段一样,都是从低地址向高地址发展
· 栈则相反,是由高地址向低地址发展




