返回介绍

4.4.1 自动变量与静态变量

发布于 2025-04-11 22:32:55 字数 1990 浏览 0 评论 0 收藏 0

变量在定义的时候,除了需要指定数据类型之外,还可以指定它的存储类型。在 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。