有的变量在程序运行的整个过程中都是存在的,而有的变量则是在调用其所在的函数时才临时分配存储单元,而在函数调用结束后,该存储单元也就立即释放了,变量不存在了。因此,变量应该有两种存储方式:静态存储方式和动态存储方式。
静态存储方式是指在程序运行期间由系统分配固定的存储空间的方式
动态存储方式是指在程序运行期间根据需要进行动态的分配存储空间的方式。
内存中供用户使用的存储空间可分为3部分:
(1)程序区
(2)静态存储区
(3)动态存储区
如图:
数据分别存放在静态存储区和动态存储区中。全局变量全部存放在静态存储区中,在程序开始执行时给全局变量分配存储区,程序执行完毕就释放。在程序执行过程中,它们占据固定的存储单元,而不是动态的进行分配和释放。
在动态存储区存放以下数据:
①函数的形参。在调用函数时给形参分配存储空间
②函数中定义的没有用关键字static声明的变量,即自动变量(如函数形参和局部变量)
③函数调用时现场保护和返回地址等
在函数调用开始时对这些数据进行存储空间的动态分配,函数结束时释放这些空间。在程序执行过程中,这种分配和释放是动态的,如果在一个程序中两次调用同一个函数,而在此函数中定义了局部变量,则在两次调用时分配给这些局部变量的存储空间的地址可能是不相同的。
- 静态局部变量
若希望函数中的局部变量在函数调用结束后不消失而继续保留原值,即其占用的存储单元不释放,在下一次调用该函数时,该变量的值就是上一次函数调用结束时的值,则应使用static关键字声明静态局部变量。
例子:
//静态局部变量
#include<stdio.h>
int func(int a);
int main()
{
int a = 2; //自动局部变量
for (int i = 0; i < 3; i++)
{
printf("%d\n", func(a));
}
system("pause");
}
int func(int a)
{
int b = 0; //自动局部变量
static int c = 3; //静态局部变量,函数调用结束后其占用的存储空间不会释放
//并且保留函数调用结束后的值
b += 1;
c += 1;
return a+b+c;
}
运行结果:
第一次运行:
a=2, b=0+1=1, c=3+1=4
a+b+c=7
第二次运行(此时c保留上一次函数调用结束后的值,即c=4):
a=2, b=0+1=1, c=4+1=5
a+b+c=8
第三次运行(此时c保留上一次函数调用结束后的值,即c=5):
a=2, b=0+1=1, c=4+1=6
a+b+c=9