存储类
C语言中存储类定义变量(或函数)的范围和生存周期,放在类型的前面。存储类关键字:auto、register、static、extern。
auto关键字:表示变量为自动存储类别,只能修饰局部变量,只有局部作用域,运行时候自动创建,运行完成自动销毁,所有未指明的局部变量都是此类型。
register关键字:用于定义存储在寄存器中的局部变量,而不是存储在内存中,所以无法获得寄存器变量的地址(‘&’)。既然是寄存器中那意味着变量的类型是有限的,比如有可能你所使用的的处理器没有足够大的寄存器存储一个double类型的变量。另外需要注意的是,这对于编译器来说只是一个请求,而不是一条命令,编译器会在可用寄存器的个数和可用高速内存的数量之间选择,所以并不一定是按照你编写的分配。
static关键字:使得变量在程序运行期间一直存在,并且保留值。修饰全局变量时,那就只有同一个文件(.c文件)可以调用,修饰局部变量,只有局部可以使用。
extern关键字:这只是提供一个全局变量的声明,也许在其他地方定义,对所有文件都是可见的。
存储类源码
存储类运行结果
另外需要注意的是,在使用typedef的时候,是不能够和存储类关键字一起的,不然编译的时候有种捅马蜂窝的感觉。不可以在一个声明中使用多个存储类关键字。
链接
在C语言程序中一个变量具有:外部链接、内部链接、空连接(这地方针对的是C语言)。
外部链接:外部链接的变量可以在多个文件中使用;
内部链接:内部链接的变量只能够在一个文件中使用;
空连接:由定义变量所在的代码块私有;
C语言变量链接
内存管理
首先根据存储类区分变量:
1、局部变量:auto修饰的,只有局部作用域,只在运行期间存在,运行开始分配内存,运行完成收回内存,在栈分配。
2、静态局部变量:static修饰的局部变量,只有局部作用域,只被初始化一次,整个程序运行一直存在,属于静态存储分配空间。
3、全局变量:全局(文件)作用域(其他文件使用extern再次声明访问),程序运行一直存在,属于静态存储分配空间。
4、静态全局变量:static修饰的全局变量,文件作用域,程序运行一直存在,由静态存储空间分配。
5、动态分配内存:malloc分配,free释放,不是由固定的规则控制内存持续时间,而是由程序员申请和释放,可以在一个函数中申请,另外一个函数中释放。属于堆中分配。
领取专属 10元无门槛券
私享最新 技术干货