7.6.2 局部变量的存储方式

1.传统情形

函数中的局部变量,一般来说,都是动态分配存储空间,也就是说,存储在动态存储区中。对这些变量分配和释放存储空间由系统自动处理:函数被调用时分配存储空间,函数执行完成后自动释放其所占用的存储空间。

2.特殊情形

有时希望函数中局部变量的值在函数调用结束后不消失(不被系统自动释放)而保留原值,也就是说,它占用的存储单元不释放,在下一次调用该函数时,该变量中保存的值就是上一次该函数调用结束时的值,这是可以做到的,只需指定该局部变量为“局部静态变量”,用static关键字加以说明即可。看看如下范例,先看看传统的函数内的局部变量输出求值结果:

执行上面的代码可以看到,程序连续输出三次相同的结果如下:

现在,修改上述的自定义函数funcTest(),修改“intc=4;”这行的内容,其他内容不变。修改后的内容如下:

再次执行上面的代码可以看到,程序三次输出的结果发生了改变,如下:

上面的代码,通过分析执行的结果,不难发现,定义一个变量时,在前面加上static(局部静态变量说明),变量的表现就不同了。具体有如下几点不同:

· 在静态存储区(见图7.12)中分配存储单元,程序整个运行期间都不释放。

· 局部静态变量是在编译时赋初值的,只赋初值一次,在程序运行的时候它已经有了初值,以后每次调用函数时不再重新赋初值,只是保留上次函数调用结束时的值,而普通变量的定义和赋值是在函数调用时才进行的。

· 定义局部静态变量时如果不赋初值,则编译时自动给其赋初值0,而常规变量,如果不赋初值,则它是一个不确定的值。

· 虽然局部静态变量在函数调用结束后仍然存在,但在其他函数中是不能引用的。

· 局部静态变量长期占用内存,降低了程序可读性(当多次调用该函数时往往弄不清当前该静态变量的值是多少)。

所以得到一个结论:如非必要,不要过多使用局部静态变量。