C语言内存分区
代码区 | data (全局初始化、静态初始化、常量) | Bss(未初始化数据区) |
---|
栈区 | 堆区
变量的属性
1、变量的分类
根据作用域:可分为全局变量和局部变量。
根据生存周期:可分为静态存储方式和动态存储方式,具体地又分为自动
的(auto)、静态的(static)、寄存器的(register)、外部的
(extern)
注、静态存储方式是指在程序运行期间分配固定的存储空间的方式。
动态存储方式是在程序运行期间根据需要进行动态的分配存储空间的方
式
动态变量和静态变量的区别:
1、存储位置
动态变量:存储在内存出栈数据区
静态变量:存储在全局数据区(静态数据区)
2、生命期
动态变量:根据你定义的位置确定,比如你在一个函数中定义的,那么超出
该函数范围变量将失效
静态变量:程序结束时才释放
3、作用域
动态变量:同样的要根据你定义的位置才能确定,和第二点的一样
静态变量:当前文件中有效
2、变量的作用域和存储类别的关系
每一个变量均有作用域和存储类别两个属性,这些属性共同用于描述一个变
量,这些不同类型的变量与存储位置的关系如下:
1、外部变量(全局变量)、静态外部变量、静态局部变量存储在静态存储
区。
2、自动局部变量(局部变量默认为自动局部变量)、函数形参存储在动态
存储区(即栈区)。
3、不论是静态存储区还是动态存储区均属于内存中的用户区。
4、而寄存器变量是存储在CPU寄存器中的而不是内存中。
3、与作用域相关的几个属性:
局部变量:在一个函数内部定义的变量是内部变量,它只在本函数范围内有
效,也就是说只有在本函数内才能使用它们,在此函数以外是不能使用这些
变量的,这种类型的变量就称为“局部变量”。
全局变量:在函数外定义的变量,可以为本源文件中其它函数所公用,有效
范围为从定义变量的位置开始到本源文件结束,这种类型的变量就称为“全
局变量”。
4、与存储类型相关的几个属性:
atuo:在声明局部变量时,若不指定 static,默认均是 auto,这类变量
都是动态分配存储空间的,数据存储在动态存储区中。
static:在声明局部变量时,使用关键字 static 将局部变量指定为“静
态局部变量”,这样在函数调用结束后不消失而保留原值,即占用的存储单
元不释放,在下一次函数调用时,该变量已有值就是上次函数调用结束时的
值。
register:在声明动态局部变量或者函数形参时,可将变量声明为
register,这样编译系统就会为变量分配一个寄存器而不是内存空间,通
过这种方式可提升对某些局部变量频繁调用的程序的性能。(寄存器运算速
度远高于内存)
extern:用于扩展全局变量的作用域。
1)比如如果函数想引用一个外部变量,但该外部变量在该函数后定义,那么
这个函数需要使用 extern 来声明变量,这样才能使用在该函数后面定义
的全局变量。
2)此外,extern 还可以在多文件的程序中声明外部变量。