【时时三省】(C语言基础)变量的存储方式和生存期
山不在高,有仙则名。水不在深,有龙则灵。 ----CSDN 时时三省
动态存储方式与静态存储方式
从变量的作用域(即从空间)的角度来观察,变量可以分为全局变量和局部变量。
还可以从另一个角度,即从变量值存在的时间(即生存期)来观察。
有的变量在程序运行的整个过程都是存在的,而有的变量则是在调用其所在的函数时才临时分配存储单元,而在函数调用结束后该存储单元就马上释放了,变量不存在了。也就是说,变量的存储有两种不同的方式:
静态存储方式和动态存储方式。静态存储方式是指在程序运行期间由系统分配固定的存储空间的方式,而动态存储方式则是在程序运行期间根据需要进行动态的分配存储空间的方式。
先看一下内存中的供用户使用的存储空间的情况。这个存储空间可以分为3部分:
( 1 )程序区;
( 2 )静态存储区;
( 3 )动态存储区。
数据分别存放在静态存储区和动态存储区中。全局变量全部存放在静态存储区中,在程序开始执行时给全局变量分配存储区,程序执行完毕就释放。在程序执行过程中它们占据固定的存储单元,而不是动态地进行分配和释放。
在动态存储区中存放以下数据:
①函数形式参数。在调用函数时给形参分配存储空间。
②函数中定义的没有用关键字static声明的变量,即自动变量。
③函数调用时的现场保护和返回地址等。
对以上这些数据,在函数调用开始时分配动态存储空间,函数结束时释放这些空间。在程序执行过程中,这种分配和释放是动态的,如果在一个程序中两次调用同一函数,而在此函数中定义了局部变量,在两次调用时分配给这些局部变量的存储空间的地址可能是不相同的。
如果一个程序中包含若干个函数,每个函数中的局部变量的生不存期并不等于整个程序比时的执行周期,它只是程序执行周期的一部分。在程序执行过程中,先后调用各个函数,此时会动态地分配和释放存储空间。
在C语言中,每一个变量和函数都有两个属性:数据类型和数据的存储类别。对数据类型,已经熟知(如整型、浮点型等)。存储类别指的是数据在内存中存储的方式(如静态存储和动态存储)。
在定义和声明变量和函数时,一般应同时指定其数据类型和存储类别,也可以采用默认方式指定(即如果用户不指定,系统会隐含地指定为某一种存储类别)。
C的存储类别包括4种:自动的( auto )、静态的( static )、寄存器的( register )、外部的( extern )。根据变量的存储类别,可以知道变量的作用域和生存期。
局部变量的存储类别
1.自动变量(auto变量)
函数中的局部变量,如果不专门声明为static(静态)存储类别,都是动态地分配存储空间的,数据存储在动态存储区中。函数中的形参和在函数中定义的局部变量(包括在复合语句中定义的局部变量),都属于此类。在调用该函数时,系统会给这些变量分配存储空间,在函数调用结束时就自动释放这些存储空间。因此这类局部变量称为自动变量。自动变量用关键字auto作存储类别的声明。
例如:
int f ( int a ) / /定义f函数,a为形参
{
auto int b,c = 3;/ /定义b,c为自动变量
...
}
其中,a是形参,b和c是自动变量,对c赋初值3。执行完f函数后,自动释放a,b,c所占的存储单元。
实际上,关键字auto可以省略,不写auto则隐含指定为“自动存储类别”,它属于动态存储方式。程序中大多数变量属于自动变量。前面几章中介绍的例子,在函数中定义的变量都没有声明为auto,其实都隐含指定为自动变量。