c语言静态局部变量演示_C语言(5)- 内存模型与作用域

(本文为原创,版权归作者所有)

在介绍函数之前,我们先探讨一下C语言的内存模型和作用域。

程序由代码(code)和数据(data)构成。计算机的体系架构决定了,程序运行时代码和数据都需要被存储在内存里,由CPU控制代码的执行和数据的访问。C语言程序的代码由语句组成,它们会被编译器翻译成机器指令,并在链接时确定代码在内存中的位置;C语言程序的数据主要是指变量,因为对变量的生命周期有不同的需求,C语言会使用不同的内存存储模型来处理变量。

C语言还根据变量可以被访问的范围规定了变量的作用域,如果变量被定义在函数(函数的概念请见下一篇文章)内部,那么就只有这个函数可以访问它,因此被称为局部变量;如果变量被定义在函数外部,那么整个程序的代码都可以对它进行访问,因此被称为全局变量。

变量的作用域与它的内存存储模式息息相关,因为作用域的不同意味着变量的不同生命周期:局部变量的生命周期与函数调用是一致的,只有程序进入函数执行时,局部变量才是有意义的,因此局部变量的内存需要动态分配,并与函数调用步调一致;全局变量的生命周期与程序本身是一致的,因此全局变量的内存从程序开始运行时就被分配了,一直保持到程序退出,它的内存地址、大小和初始值在编译和链接阶段就已经确定,因此可以被看作是静态分配的。

通常,在软件的编译和链接阶段可以确定的行为被称为静态,而在程序运行中才能确定的则被称为动态。所以从内存分配的角度来说,全局变量是静态的,而局部变量是动态的。

C语言还引入了static关键字用来修饰变量和函数,它的作用因不同的对象而不同。static如果用于修饰局部变量,那么这个局部变量就会从动态变量变为静态变量,它的作用域依然保持局部的特性,但是内存分配会变得和全局变量一样,在编译链接阶段确定。static还可以作用于全局变量,这样做不会改变变量的静态性质,但是会限制它的作用域,它的访问范围从整个程序缩小到了变量所在的文件。实际上完全可以使用全局变量来替代static局部变量和static全局变量,但是引入static变量使得程序的语义更加清晰,它清楚的表明这个变量只能在函数或者文件内部访问,否则编译器就会给出错误提示。static局部变量和static全局变量可以被统称为静态变量。

实际上,从内存模型上来讲,全局变量和静态变量是一致的,但是人们通常会将它们区分开来表示。全局和局部是作用域的概念,静态是内存模型的概念,将它们混在一起的确容易引起混淆,不过只要在使用中注意一下,应该不会有大的问题。

static还可以修饰函数,它的作用是改变函数的作用域,但不会影响代码的存储结构。static使得函数的访问范围从全局缩小到了函数所在的文件,从全局函数变为局部函数。引入局部函数的意义在于可以减少跨文件、跨模块的命名冲突,使用静态变量和局部变量也具有类似的作用。

全局变量和静态变量是静态分配的,它们和编译链接联系紧密,因此关于它们的内存分配的一些细节会在编译链接章节做具体分析。局部变量是动态分配的,因为它与函数调用紧密相关,我们会在讨论函数时介绍局部变量的分配与释放。

还有一种动态分配内存的机制,就是从系统的内存堆(heap)中分配内存,然而C语言并没有在语言层面上支持这种动态内存分配的方式,程序员需要调用系统函数(比如malloc())来分配内存然后通过指针变量来访问内存中的数据。因此对于C语言来说,从系统堆中申请动态内存是一个程序设计上的话题,而不是一种语言特性。

C语言(1- 变量和类型:

蓝彼得:C语言(1)- 变量和类型​zhuanlan.zhihu.com
77406041c1a209a80232afb799a8aba0.png

C语言(2- 定点数和浮点数:

蓝彼得:C语言(2)- 定点数和浮点数​zhuanlan.zhihu.com
bfe88f46e2a6cb309f75c0cc8072b7b2.png

C语言(3- 运算符与表达式:

蓝彼得:C语言(3)- 运算符与表达式​zhuanlan.zhihu.com
77406041c1a209a80232afb799a8aba0.png

C语言(4- 控制流:跳转、条件和循环:

蓝彼得:C语言(4)- 控制流:跳转、条件和循环​zhuanlan.zhihu.com
77406041c1a209a80232afb799a8aba0.png

C语言(5- 内存模型与作用域:

蓝彼得:C语言(5)- 内存模型与作用域​zhuanlan.zhihu.com
fb528439f2e1f39952c431452ac7a60c.png

C语言(6- 函数调用和栈:

蓝彼得:C语言(6)- 函数调用和栈​zhuanlan.zhihu.com
77406041c1a209a80232afb799a8aba0.png

C语言(7- 递归:

蓝彼得:C语言(7)- 递归​zhuanlan.zhihu.com
6e11ea9d10870520b8fcc88cd9a7a38f.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值