1,动态存储方式与静态存储方式
①区别与联系
区别:局部变量与全局变量是从作用域的角度对变量类型的划分,而静态存储方式以及动态存储方式则是从
变量存在的时间,即
生存期角度对变量类型的划分。前者从空间的角度入手,后者从时间的角度入手。
联系:两者相互交织,一起结合来刻画变量的类型。
②定义:
静态存储方式:程序运行期间由系统分配
固定的存储空间的方式。
动态存储方式:程序运行期间根据需要进行
动态的分配存储空间的方式。
③铺垫
用户区分为:程序区、静态存储区、动态存储区。
数据分别存放在静态存储区与动态存储区中。
④大概划分
全局变量全部存放于静态存储区中。
动态存储区中存放着函数形参(在调用时给形参分配存储空间)、自动变量(未加static声明的局部变量)、函数调用时的现场保护与返回地址。
一图以蔽之:
⑤各自特点
静态存储方式:程序开始执行时就在静态存储区中分配存储空间(编译期间),程序执行完毕就释放。在程序执行过程中它们占据固定的存储单元。
动态存储方式:在函数调用开始时分配动态存储空间,函数结束时释放这些空间。这种分配与释放在程序执行的过程中是动态的。
2,干货
这部分知识就杂了。且听我娓娓道来:
C语言中,每一个变量与函数有两个属性:
数据类型(int/long/char/...)与
数据的存储类别。存储类别是数据在内存中的存储方式(
说白了,在我看来就是把作用域与生存期相互交错的复杂生态具体化了,通过其存储类别就能得到其作用域与生存期的状况)。具体有四种:自动的(auto)、静态的(static)、寄存器的(register)、外部的(extern)。详述见图:
3,其他
变量声明与定义的异同:
相同点:广义上说,定义是定义性声明,声明是引用性声明,即,定义和声明都是声明,声明包括了定义。
不同点:狭义上讲,定义是需要分配存储空间的,而声明不需要分配存储空间,仅仅是对作用域的改变。
注意点:使用auto/static/register声明变量时,必须在定义变量的基础上加上这些关键字,不能单独使用,如:
static int a; // 正确
int a; static a; // 错误
只有使用extern可以分开进行声明,拓展作用域。
4,总结