static是C语言中的一个关键字。它可以修饰局部变量、全局变量和函数。
1.static修饰局部变量。
解决两个问题:
(1)静态局部变量和局部变量有什么不同?为什么?
(2)静态局部变量在什么时候初始化的?
先来看看不用static的情况
#include
void test()
{
int a = 0;
printf("%d ", a++);
}
int main()
{
int i = 0;
while (i++ < 10)
test();
return 0;
}
运行结果如下:
0 0 0 0 0 0 0 0 0 0
如果在test函数的int a前面加上static:
#include
void test()
{
static int a = 0;
printf("%d ", a++);
}
int main()
{
int i = 0;
while (i++ < 10)
test();
return 0;
}
结果就变成了
0 1 2 3 4 5 6 7 8 9
由此我们可以看出,如果用 static 修饰 test 函数中的局部变量a,当代码跳出test函数的作用域的时候,局部变量a是没有被销毁的,下一次调用 test函数时仍然沿用上一次 a 的值作为初始值。
那么为什么会这样呢?
首先我们要知道,C语言中内存是分为好几个区的,不同的量存储在不同的区中。局部变量是存储在“栈区”,而静态变量是存储在“静态区”的。在int a 前面加上static后,a就不再是原先的局部变量,而是成为了一个静态局部变量。a 的存储位置也从栈区变到了静态区。
我们都知道,局部变量的作用域仅限于函数内部。跳出函数时,局部变量所占的空间就会被释放,局部变量随之销毁。也就是说,局部变量的生命周期等于该函数的生命周期。而在static修饰局部变量的时候,该变量的生命周期就延长到了和程序的生命周期等同。只有当整个程序结束运行的时候,静态局部变量才会被销毁。
再来看这个test函数。
void test()
{
static int a = 0;
printf("%d ", a++);
}
它的第一个语句是static int a=0;这是否意味着每一次调用test函数的时候,都要重新定义一遍a呢?
当然不是了,不然静态变量怎么保存上一次调用函数时a的值呢?
其实啊,这里静态局部变量a的初始化发生在代码执行之前,也就是编译的时候。这个时候电脑就已经在内存的静态区中开辟了一个名为 a 的空间了,直到整个程序结束后,该空间才会被释放掉。
检验起来也很简单,让程序跑起来,我们用编译器很容易看到,在执行static语句的时候,是没有对应的汇编语言的。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)