static的用法(C语言)

static的用法(C语言),第1张

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语句的时候,是没有对应的汇编语言的。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/713537.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-24
下一篇 2022-04-24

发表评论

登录后才能评论

评论列表(0条)

保存