C语言中的变量根据其生存周期,可以分为静态存储方式和动态存储方式。
静态存储方式:是指在程序运行期间分配固定的存储空间的方式。静态存储区中存放了在整个程序执行过程中都存在的变量,如全局变量。
动态存储方式:是指在程序运行期间根据需要进行动态的分配存储空间的方式。动态存储区中存放的变量是根据程序运行的需要而建立和释放的,通常包括:自动变量;函数形参;函数调用时的现场保护和返回地址等。
静态分配和动态分配的区别主要是两个:
时间不同:静态分配发生在程序编译和连接的时候,动态分配则发生在程序调入和执行的时候。
空间不同:堆都是动态分配的,没有静态分配的堆。动态分配由函数malloc进行分配(需要注意的是有一个malloc,就有一个free对应)。栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。不过栈的动态分配和堆不同,它的动态分配是由编译器进行释放,无需人工实现。
C语言的内存分配方式:堆和栈
变量示例
C语言中的变量具体包含有四种:自动的(auto),静态的(static),寄存器的(register),外部的(extern),如果不加以声明,则认为是auto型,自动分配存储空间,属于动态存储方式。
Static声明局部变量是在函数调用结束后不消失而保留原值,即占用存储单元不释放,在下一次调用该函数时,该变量保持上次函数调用结束时的值。Static在对全局变量声明中,该变量的作用域则仅限于本文件模块操作。
Register变量是C语言中允许将局部变量的值放在CPU中的寄存器中需要时直接从寄存器中取出来参加运算,不必再到内存中提取,但是计算机系统中寄存器数量有限,不能任意定义任意多的存储器,局部静态变量不能定义为寄存器变量。
寄存器是最贴近CPU的,而且CPU只在寄存器中进行存取。寄存的意思是暂时存放数据,不用每次都从内存中取,它是一个临时的存放数据的空间。
关于寄存器变量有以下事项需要注意:
为寄存器变量分配寄存器是动态完成的,因此,只有局部变量和形式参数才能定义为寄存器变量。
寄存器的长度一般和机器的字长一致,所以,只有较短的类型如int、char、short等才适合定义为寄存器变量,诸如double等较大的类型,不推荐将其定义为寄存器类型。
CPU的寄存器数目有限,因此,即使定义了寄存器变量,编译器可能并不真正为其分配寄存器,而是将其当做普通的auto变量来对待,为其分配栈内存。当然,有些优秀的编译器,能自动识别使用频繁的变量,如循环控制变量等,在有可用的寄存器时,即使没有使用 register 关键字,也自动为其分配寄存器,无须由程序员来指定。
计算机系统的硬件组织:总线、IO、主存、CPU
Extern声明外部变量,表示变量在别的文件中。在一个文件中,如果定义之前的函数想引用该外部变量,则应该在引用之前用关键字extern对该变量做外部变量声明。在多文件中,也可以采用extern声明的办法进行外部变量声明。有时希望某些局部变量只限于被本文件引用,而不能被其他文件引用,这时就可以采用在定义外部变量时外加一个static,这在程序模块化设计中加强了通用性。
-
C语言
+关注
关注
180文章
7604浏览量
136676 -
函数
+关注
关注
3文章
4327浏览量
62567 -
变量
+关注
关注
0文章
613浏览量
28359
发布评论请先 登录
相关推荐
评论