【c语言】C语言:存储类、链接、内存管理


【c语言】C语言:存储类、链接、内存管理
文章图片
【c语言】C语言:存储类、链接、内存管理
存储类
C语言中存储类定义变量(或函数)的范围和生存周期 , 放在类型的前面 。 存储类关键字:auto、register、static、extern 。
auto关键字:表示变量为自动存储类别 , 只能修饰局部变量 , 只有局部作用域 , 运行时候自动创建 , 运行完成自动销毁 , 所有未指明的局部变量都是此类型 。
register关键字:用于定义存储在寄存器中的局部变量 , 而不是存储在内存中 , 所以无法获得寄存器变量的地址(‘&’) 。 既然是寄存器中那意味着变量的类型是有限的 , 比如有可能你所使用的处理器没有足够大的寄存器存储一个double类型的变量 。 另外需要注意的是 , 这对于编译器来说只是一个请求 , 而不是一条命令 , 编译器会在可用寄存器的个数和可用高速内存的数量之间选择 , 所以并不一定是按照你编写的分配 。
static关键字:使得变量在程序运行期间一直存在 , 并且保留值 。 修饰全局变量时 , 那就只有同一个文件(.c文件)可以调用 , 修饰局部变量 , 只有局部可以使用 。
extern关键字:这只是提供一个全局变量的声明 , 也许在其他地方定义 , 对所有文件都是可见的 。
存储类源码
存储类运行结果
另外需要注意的是 , 在使用typedef的时候 , 是不能够和存储类关键字一起的 , 不然编译的时候有种捅马蜂窝的感觉 。 不可以在一个声明中使用多个存储类关键字 。
链接
在C语言程序中一个变量具有:外部链接、内部链接、空连接(这地方针对的是C语言) 。
外部链接:外部链接的变量可以在多个文件中使用;
内部链接:内部链接的变量只能够在一个文件中使用;
空连接:由定义变量所在的代码块私有;
C语言变量链接
内存管理

首先根据存储类区分变量:
1、局部变量:auto修饰的 , 只有局部作用域 , 只在运行期间存在 , 运行开始分配内存 , 运行完成收回内存 , 在栈分配 。
2、静态局部变量:static修饰的局部变量 , 只有局部作用域 , 只被初始化一次 , 整个程序运行一直存在 , 属于静态存储分配空间 。
3、全局变量:全局(文件)作用域(其他文件使用extern再次声明访问) , 程序运行一直存在 , 属于静态存储分配空间 。
4、静态全局变量:static修饰的全局变量 , 文件作用域 , 程序运行一直存在 , 由静态存储空间分配 。
【【c语言】C语言:存储类、链接、内存管理】5、动态分配内存:malloc分配 , free释放 , 不是由固定的规则控制内存持续时间 , 而是由程序员申请和释放 , 可以在一个函数中申请 , 另外一个函数中释放 。 属于堆中分配 。