C语言中变量的存储方式和生存期

在C语言的一个源文件中从变量的作用域的角度来观察,变量可分为全局变量和局部变量(外部变量)

   1、局部变量分量种,一种是函数内部定义的变量,它只能在本函数内使用,此函数外不能使用。另一种是在函数的复合语句(如{}包含的程序块)中定义变量,它只能在本复合语句内使用,该复合语句外不能使用。

   2、全局变量是在函数之外定义的变量。全局变量可以为本文件中函数所共用(用extern声明后也可被外部)。它的有效范围从定义位置开始到本源文件结束。全局变量在所有函数外定义,在函数内声明,函数内声明可以省略。


内存中供用户使用的存储空间可分为3部分

   (1)程序区;

   (2)静态存储区,存储全局变量(包括外部变量)和静态局部变量等。静态存储变量默认初值为0。

   (3)动态存储区,存储函数形式参数、函数中定义的自动变量和函数调用是的现场保护和返回地址等。动态存储变量初始值不确定。

所以从内存变量值存储方式来观察,变量的存储方式有两种:静态存储方式和动态存储方式。静态存取区还分为栈(由系统分配释放)和堆(由程序员分配释放)除了存储在内存中,有些变量可以存储在CPU的寄存器中。


C语言的存储类别有4种:自动的(auto)、静态的(static)、寄存器的(register)和外部的(extern)。局部变量的存储类别有:

   (1)、自动变量即动态局部变量(离开函数,变量消失),存储在内存动态存储区。函数中的函数如果不声明为static都指定为auto即自动变量。自动变量只在函数被调用时存在,离开函数时则消失。下次调用时分配的内存位置可能不同。

   (2)、静态局部变量(离开函数,值仍保留),存储在内存静态存储区。函数调用结束时,其占用的存储单元不释放。下次在调用该函数时,该变量以有值。但因为其为局部变量,故不能被其他函数引用。

   (3)、寄存器变量(离开函数,值就消失),存储在CPU中的寄存器。

形式参数可以定义为自动变量或寄存器变量。


全局变量都存储在内存静态存储区。因此他们存在于整个程序运行过程。但按可引用范围可分为

   (1)静态外部变量(用static声明,只限本文件使用)

   (2)外部变量(非静态的外部变量,允许其他文件通过extern引用)。


注意:

(1)在程序中如果局部变量和全局变量同名,全局变量被局部变量屏蔽。

(2)编译器遇到extern时,先在本文件中找外部变量的定义,如果找到就扩展作用域到本文件。如果找不到就在连接时从其他文件中找外部变量的定义,如果找到就扩展作用域到本文件。如果仍未找到,就按出错处理。

(3)多局部变量用static声明,把它分配在静态存储区。对全局变量用static声明,则限制改变量的作用域于本文件。




参考

【1】 谭浩强著. C程序设计(第四版). 北京:清华大学出版社,2010

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页