4.4.1 自动变量与静态变量
变量在定义的时候,除了需要指定数据类型之外,还可以指定它的存储类型。在 C 语言中,可以使用“auto”和“static”两个关键字来指定变量的存储类型。例如:
auto int a; //自动存储类型变量,简称自动变量 static int b; //静态存储类型变量,简称静态变量
“auto”表示变量是自动存储类型的,简称为自动变量,“static”表示变量是静态存储类型的,简称为静态变量。默认情况下,在函数中定义的变量属于自动变量,所以前面的“auto”关键字是可以省略的,即“auto int a”与“int a”是一样的,都表示自动变量。
自动变量与静态变量之间有哪些区别呢?
1.存储位置
自动变量存储在栈中,而静态变量存储在静态区。当用户用鼠标双击“.exe”后缀的可执行文件时,程序被启动,系统会为该程序分配一块内存,而这块内存又会被划分为代码区、静态区、堆和栈四个区块,分别存储程序所使用的各种不同类型的数据,如图 4.10 所示。
图 4.10 内存四区
栈是由系统管理的一块内存区域,例如我们定义一个自动变量时,系统会根据变量的数据类型大小在栈内开辟一块内存,当不再使用这个变量时,系统会将它所使用的内存回收。
而堆是由程序员管理的一块内存区域,其中内存的分配、使用和回收都是由程序员通过调用相应的内存管理函数来完成。关于这方面内容,将在第 8 章进行介绍。
2.初始化
自动变量不会被默认初始化,而静态变量会被默认初始化。也就是说,当定义一个变量时,若该变量是自动类型的,除非用户主动对它进行初始化,编译器是不会对它进行初始化的;若该变量是静态类型的,如果没有对它进行初始化,编译器会默认对其进行初始化,通常会将变量初始化值为 0。例如:
在 test 函数中,定义了 4 个 int 类型的变量,其中变量 a 和 b 属于自动变量,变量 a 被初始化值为 10,而变量 b 没有初始化,编译器是不会为其进行初始化,所以变量 b 的值是不确定的。变量 c 和 d 属于静态变量,其中变量 c 被初始化值为 20,虽然变量 d 没有被初始化,但编译器会为其进行初始化,值为 0。
3.生命期
就像人有生老病死一样,C 语言中的变量也是有生命的,我们把它称为变量的生命期。只有在变量的生命期内,用户才可以去使用这个变量。在变量的生命期之前或变量生命期已经结束,就无法再使用这个变量了。所以用户要清晰地知道变量生命期的开始和终结点。
自动变量的生命期是从变量所在的函数被执行后,变量被定义时开始,至函数结束时,其生命期结束,也可以说自动变量是属于函数生命期。
静态变量的生命期是从程序运行时开始,至程序结束时,其生命期结束,也可以说静态变量属于程序生命期。
test 函数中的变量 a 和 b 的生命期是从 test 函数被执行后,变量被定义时开始,至 test 函数结束时止。所以每次 test 函数被执行后,编译器都要为变量 a 和 b 在栈上分配内存空间(位置有可能会发生变化),在 test 函数结束后,编译器会将变量 a 和 b 所占用的内存空间回收。
test 函数中的变量 c 和 d 是静态变量,它们存储在静态区,所以位置不会发生变化。由于它们拥有程序生命期,即使 test 函数结束了,它们的生命期仍然存在,所占用的内存空间也不会被回收,所以只有当 test 函数第一次被执行时,编译器会对其进行初始化的操作,之后都不会再进行初始化了,直至程序结束时,它们所占用的内存空间才会被系统回收。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论