zl程序教程

您现在的位置是:首页 >  硬件

当前栏目

存储类别、链接和内存管理(二)

内存链接存储 管理 类别
2023-06-13 09:11:20 时间

上期我们介绍了作用域、链接和存储期。这期我们继续介绍。

一、自动变量

自动存储类别的变量具有自动存储期、块作用域且无链接。默认情况下,声明在块或函数头中的任何变量都属于自动存储类别。使用auto作为存储类别说明符。

再复习一下:

无链接意味着这些变量属于定义它们的块、函数或原型私有。

二、寄存器变量

在函数头中使用关键字register,便可请求寄存器变量。

它们都是块作用域、无链接和自动存储期。通常变量储存在内存中,寄存器变量储存在CPU的寄存器中,换句话说,储存在最快的可用内存中。与普通变量相比,访问这些变量的速度更快。

三、块作用域的静态变量

静态变量(static variable)听起来自相矛盾,像是一个不可变的变量。实际上,静态的意思是该变量在内存中原地不动,并不是说它的值不变。具有文件作用域的变量自动具有(也必须是)静态存储期。前面提到过,可以创建具有静态存储期、块作用域的局部变量。这些变量和自动变量一样,具有相同的作用域,但是程序离开它们所在的函数后,这些变量不会消失。也就是说,这种变量具有块作用域、无链接,但是具有静态存储期。计算机在多次函数调用之间会记录它们的值。在块中(提供块作用域和无链接)以存储类别说明符static(提供静态存储期)声明这种变量。来看下面例子:

四、外部链接的静态变量

外部链接的静态变量具有文件作用域、外部链接和静态存储期。该类别有时称为外部存储类别(external storage class),属于该类别的变量称为外部变量(external variable)。把变量的定义性声明(defining declaration)放 在在所有函数的外面便创建了外部变量。当然,为了指出该函数使用了外部 变量,可以在函数中用关键字extern再次声明。

units具有文件作用域、外部链接和静态存储期。所以即使我们在main函数里没有声明uints,程序一样可行。来看看注释掉extern声明。

再看看

为什么会这样?因为在函数里面定义的units是局部变量,具有块作用域、自动存储期、无链接属性。相当于外部变量units和局部变量units是独立的。

五、内部链接的静态变量

该存储类别的变量具有静态存储期、文件作用域和内部链接。这种变量过去称为外部静态变量(external static variable),但是这个术语有点自相矛盾(这些变量具有内部链接)。但是,没有合适的新简称, 所以只能用内部链接的静态变量(static variable with internal linkage)。普通的外部变量可用于同一程序中任意文件中的函数,但是内部链接的静态变量只能用于同一个文件中的函数。