对于动态存储区的数据,在函数调用时分配动态存储空间,函数结束时释放这些空间
在步伐执行过程中,这总分配和释放是动态的,如果在一个步伐中两次调用同一函数,而在此函数中定义了局部变量,在两次调用时分配给这些局部变量的存储空间的地址可能是不相同的
如果一个步伐中包罗若干个函数,每个函数中的局部变量的生存期并不等于整个步伐的执行周期,它只是步伐执行周期的一部分。在步伐执行过程中,先后调用各个函数,此时会动态的分配和释放存储空间
在 C 语言中,每一个变量和函数都有两个属性:数据类型和数据的存储类别。对数据类型,如整型、浮点型等。存储类别指的是数据在内存中存储的方式(如静态存储和动态存储)
在定义和声明变量和函数时,一般应同时指定其数据类型和存储类别,也可以采用默认方式指定(即如果用户不指定,系统会隐含的指定为某一种存储类别)
C 的存储类别包括4种:自动的(auto)、静态的(static)、寄存器的(register)、外部的(extern)根据变量的存储类别,可以知道变量的作用域和生存期
局部变量的存储类别
自动变量(auto 变量)
函数中的局部变量,如果不专门声明为 static(静态)存储类别,都是动态的分配存储空间的,数据存储在动态存储区中。函数中的形参和在函数中定义的局部变量(包括在复合语句中定义的局部变量),都属于此类。在调用该函数时,系统会给这些变量分配存储空间,在函数调用结束时就自动释放这些存储空间。因此这类局部变量称为自动变量。自动变量用关键字 auto 作存储类别的声明
auto 变量类型 变量名
实际上,关键字“auto”可以省略,不写 auto 则隐含指定为“自动存储类别”,它属于动态存储方式。步伐中大多数变量属于自动变量
auto 变量类型 变量名等价于变量类型 变量名
静态局部变量(static 局部变量)
一个C步伐可以由一个或多个源文件组成。如果一个步伐包罗两个文件,在两个文件中都要用到同一个外部变量 Num ,不能分别在两个文件中各自定义一个外部变量 Num ,否则在进行步伐的毗连时会出现“重复定义”的错误。精确的做法是:在任一文件中定义外部变量 Num ,而在另一个文件中用 extern 对 Num 作“外部变量声明”,即“extern Num”。在编译和毗连时,系统会由此知道 Num 有“外部毗连”,可以从别处找到已定义的外部变量 Num,并将在另一个文件中定义的外部变量 Num 的作用域扩展到本文件,在本文件中可以正当的引用外部变量 Num
用这样方法扩展全局变量的作用域应非常慎重,因为在执行一个文件中的操作时,可能会改变该全局变量的值,会影响到另一个文件中全局变量的值,从而影响该文件中函数的执行结果
在编译时遇到 extern 时,先在本文件中找外部变量的定义,如果找到,就在本文件中扩展作用域;如果找不到,就在毗连时从其他文件中找外部变量的定义。如果从其他文件中找到了,就将作用域扩展到本文件中;如果找不到,就报错
将外部变量的作用域限制在本文件中