c语言中需要内存来存放数据。而内存主要分为两类:静态存储区和动态存储区。
1、静态存储区
(1)分为数据区(只读数据区(代码区?在linux中又叫文本段.text)、读写数据区.data)、未初始化区(BSS)。
(2)它们都是在程序编译连接阶段确定的。
2、动态存储区
(1)分为堆和栈。
(2)程序执行过程中动态分配,大小也随之动态变化。
(3)从内存管理的实现的角度看来,堆使用链表实现,而栈使用的是线性存储的方法。
补:
(1)关于栈
栈:栈是先进后出,实际的操作中,栈内存可以有满栈和空栈的情况。
满栈的情况下,栈指针当前的位子是已经使用的的栈区域;空栈的情况是,栈指针当前的位子是没有使用的栈区域。
满栈时:入栈,是先移动指针,再放入数据;出栈则是先出数据,再移动指针;
空栈时:入栈,是先放入数据,再移动指针;出栈则是先移动指针,再出数据;
(2)关于全局变量和局部变量的存储
a、全局变量只会存在于数据区或者BSS区。如果初始化(为非0),则存储在数据区,否则(初始化为0或者不初始化)存储在BSS区。
b、局部变量分为普通(auto)局部变量、静态局部变量。
前者存储在栈中,如果没有初始化则为随机值;后者存储在数据区(初始化为非0)或BSS区(初始化为0或者不初始化)。
3、存储类、生命周期,作用域、链接属性
(1)存储类表明变量在哪里存储,生命周期表明什么时候为变量分配、收回内存,作用域表明变量起作用的范围(代码块,函数域,文件域);
(2)存储类决定了生命周期,作用域决定了链接属性。
(3)上面1,2中是存储类的知识点;
(4)作用域表明变量起作用的范围(代码块,函数域,文件域);
(5)链接属性有外链接、内链接、空链接(不参与链接)。