C/C++教程

C语言存储类别、链接和内存管理

本文主要是介绍C语言存储类别、链接和内存管理,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

一、存储类别

C提供了多种不同类型或存储类别在内存中储存数据。
从硬件来看,被储存的值都占用一定的物理内存,C语言把这样的一块内存称为对象。对象可以储存一个或多个值。

int num = 0;

上面声明创建了一个名为num的标识符。标识符是一个名称,标识符可以用来指定特定对象的内容。
可以用存储期描述对象,所谓存储期是指对象在内存中保留了多长时间。标识符用于访问对象,可以用于作用作用域和链接描述边师傅,标识符的作用域和链接表明了程序的那些部分可以使用它。不通的储存类别具有不同的存储期、作用域和链接。

1、作用域

作用域描述程序中可访问标识符的区域。一个C变量的作用域可以是块作用域、函数作用域、函数原型作用域或文件作用域。
是用一块花括号括起来的代码区域。
函数作用域仅用于goto语句的标签。
函数原型作用域用于函数原型中的形参名。
变量的定义在函数的外面,具有文件作用域。具有文件作用域的变量,从他的定义到该定义所在文件的末尾均可见。

2、链接

C变量具有三种链接属性:外部链接、内部链接或无链接。具有块作用域、函数作用域或函数原型作用域的变量都是无链接变量。这意味着这些变量属于定义他们的块、函数或原型私有。具有文件作用域的变量可以使外部链接或内部链接。外部链接变量可以在多文件程序中使用,内部链接变量只能在一个翻译单元内使用。定义外部链接使用static。

#include <stdio.h>
static int gianats = 5;  // 文件作用域,外部链接
int gianats = 5;  // 文件作用域,外部链接
int main
{
	return 0;
}
3、存储期

作用域和链接描述了标识符的可见性。存储期描述了通过这些标识符访问对象的生存期。C对象有四种存储期:静态存储期、线程存储期、自动存储期、动态分配存储期。
如果对象机油静态存储期、那么它在程序的执行期间一直存在。文件作用域机油静态存储期。对于文件作用域变量,关键字static表明了其链接属性是外部链接,而非存储期,无论是内部链接还是外部链接,多有的文件作用域变量都具有静态存储期。
线程储存器用于并发程序设计,程序执行可被分为多个线程。具有线程存储期的对象,从被声明时到线程结束一直存在。以关键字*_Thread_local*声明一个对象是,每个线程都获得该该变量的私有备份。
块作用域的变量通常都具有自动存储期。当程序进入定义的这些变量的块时,为这些变量分配内存;当退出这个块时,释放刚才为变量分配的内存。这种做法相当于把自动变量占用的内存视为一个可重复使用的工作区或暂存区。例如,一个函数调用结束后,其变量占用的内存可用于储存下一个被调用函数的变量。
5中存储类别:自动、寄存器、静态作用域、静态外部链接、静态外部链接。

存储类别存储期作用域链接声明方式
自动自动块内
寄存器自动块内,使用关键字static
静态外部链接静态文件外部所有函数外
静态内部链接静态文件内部所有函数外,使用关键字static
静态无连接静态块内,使用关键字static
4、自动变量

属于自动存储类别的变量具有自动存储期、块作用域且无链接。默认情况下,声明在块或函数头中的任何变量都属于自动存储类别。可以使用关键字auto(和C++使用auto方法不同),如下

int main()
{
	auto int plox;
	return 0;
}

块作用域和无链接只有在变量定义所在的块中才能通过变量名访问该变量(参数用于传递变量的值和地址给另外一个函数,但这是间接的方法)。另一个函数可以使用同名变量,但是该变量是储存在不同内存位置上的另一个变量。变量具有自动存储期意味着,程序在进入该变量声明所在的块时变量存在,程序在退出该块时变量消失。原来该变量占用的内存位置现在也可以做他用。

5、寄存器变量

寄存器变量储存在CPU的寄存器,或者概括的说,储存在最快的可用内存中。比普通变量访问和处理的速度风快。由于寄存器变量储存在寄存器而非内存中,所以无法获取寄存器变量的地址。绝大多数方面,寄存器变量和自动变量都一样,都是块作用域、无链接和自动存储期。
使用存储类别说明符register可以声明寄存器变量。

int main()
{
	register int quick;
}

register 更像是一种请求,编译器必须根据寄存器最快可用内存的数量平衡你的请求,或者忽略你的请求,这种情况,寄存器变量就变成了普通变量,但是任然不可以访问地址。

6、 块作用域的静态变量

静态的意思是指该变量在内存地址中原地不动。具有文件作用域的变量自动具有也必须是 静态储存期。
具有静态存储期、块作用域的局部变量和自动变量一样,具有相同的作用域,程序离开他们所在的函数后,这些变量不会消失。这种变量具有块作用域、无链接。
使用关键字static声明。

7、 外部链接的静态变量

外部链接的静态变量具有文件作用域、外部链接和静态存储期。也称为外部储存类别,属于该类别的变量称为外部变量。把变量的定义性声明放在在所有函数的外面便创建了外边变量。把变量的定义性声明放在所有函数的外面便创建了外部变量。可以使用关键字再生声明声明了外部变量。如果一个源代码文件使用的外部变量定义在另一个源代码文件中,则必须使用extern在该文件中声明该变量。

8、 外部链接的静态变量

该存储类别的变量具有静态存储期、文件作用域和内部链接。使用static定义。

9、多文件

C语言通过在一个文件中进行定义式声明,然后在其他文件中进行引用式声明来实现共享。也就是说,除了一个定义式声明,其他声明都要使用extern关键字。只有定义式声明才能初始化变量。

10、存储类别说明符

1、auto说明符表明变量是自动存储期,只能作用域块作用域的变量声明中。由于在块中声明的变量本身具有自动存储期,所有使用auto只要是为了明确表达要与外部变量的局部变量同名的意图。
2、register说明符也只用于块作用域的变量,它把变量归为寄存器类别,请求最快速度访问该变量。同时保护该变量地址不被获取。
3、用static说明符也只用于块作用域的变量,载入程序时创建对象,当程序结束时,对象消失。如果static用于文件作用域声明,作用域受限于改文件。如果static用于块作用域声明,作用域则受限于该快,因此,只要程序在运行对象就存在并保留其值,但只有在执行块内代码是,才能通过标识符访问。块作用域的静态变量无链接。文件作用域的静态变量具有内部链接。
4、external说明符表明声明的变量定义在别处。如果包含extern的声明具有文件作用域,则引用的变量必须具有外部链接。。如果包含extern的声明具有块作用域,则引用的变量可能具有外部链接或内部链接,这取决该变量的定义式声明。

11、储存类别和函数

函数分为外部函数(默认)、静态函数、内联函数。外部函数可以被其他文件的函数访问,但是静态函数只能用于其定义所在的文件。

这篇关于C语言存储类别、链接和内存管理的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!