C语言杂谈(三)存储类别
本文讨论C语言中的存储类别,包括数据在内存的存储、变量的存储类别、函数的存储类别、生存周期。下图为计算机的存储空间,有寄存器和内存。
一、存储区域
1.寄存器:存放立即参加运算的数据。
2.系统区:存放系统软件。
3.用户程序代码区:存放用户程序的程序代码。
4.库程序代码区:存放库函数的代码。
5.数据区,分为堆区、栈区和静态存储区。
(1)堆区:存放动态变量,即由malloc申请的动态变量。
(2)栈区:存放自动存储类型的变量,包括函数和复合语句中的局部变量等。
(3)静态存储区:存放具有显式声明的静态类型的变量。

二、变量的存储类别
1.静态变量
静态变量:这里的静态指的一般程序设计语言概念中的静态变量,即程序中显式声明的变量。静态变量有一个名字,在编译时,编译程序已经给静态变量分配了内存空间。
静态变量的存储类型分为两大类:静态(包括static和extern)和自动(包括auto)
auto:自动存储类别,默认的存储类别
存储在栈区,作用域在声明它的函数和复合语句中。auto具有本地生存期,当声明自动变量的个体执行结束,自动变量结束生存周期,不再存在。
auto int i;
int j;//默认为auto存储类别
static:静态存储类别
存储在静态存储区。静态变量分为静态局部变量和静态全局变量。
静态局部变量:具有本地生存期,生存周期是整个程序,在程序结束后,生存期结束并被删除。但作用域仅在声明它的个体中。离开复合语句或函数,静态变量依然存在但不能被访问。再次进入声明该静态变量的个体时,可以继续使用,而且保留浅一些使用留下的值。静态局部变量只能在开始时初始化一次。
全局局部变量:生存周期是包含它声明的整个程序文件,可随时访问。
{
static int a;
...
}//作用域仅在复合语句内,同auto
//离开复合语句,静态局部变量存在但不能被使用,值保持上一次的使用
extern外部存储类别
尽可用作全局变量的存储类型。存储在静态存储区。在顶层声明中,extern是默认存储类别,所有未加extern的全局变量均被视为外部变量。在使用其他文件的外部变量时,使用extern说明符,这样在连接时分配相同的存储区,占用相同的存储空间。若两个文件中的同名全局变量都没有使用extern,会在连接时出现错误,因为他们都被声明成全局的外部变量,都分配了存储空间,产生冲突。
文件1:
int a;//extern是全局变量默认的存储类别
文件2
extern int a;//使用文件1的局部变量,占用相同存储空间
注:register寄存器存储类型可以显式声明,表明变量要分配在计算机CPU中的寄存器中,对于频繁访问的变量,可以节约时间,提高程序运行效率。但是,寄存器数量很有限,若寄存器边纳凉太多,将被认为是auto类型。
2.动态变量
动态变量:是指使用申请空间函数(如malloc)动态申请的空间,存放在堆区。动态变量没有显式声明,在编译的时候不分配(也无法分配)空间。在程序运行时,动态变量由指针标识。使用完毕后,使用释放空间函数(如free)等释放。动态函数具有动态生存期,生存周期是显式实现的。
float *p;
p=(float*)malloc(sizeof(float));//生存周期开始
...
free(p);//生存周期结束
三、函数的存储类别
C语言的函数可以被定义成static和extern两种存储类别。
static:内部函数
与变量的static存储类别相区别。内部函数的作用域调用范围仅限于本文件,在不同源文件中的同名静态函数不会混淆。
extern:外部函数
函数默认的存储类别。外部函数在一个源文件中被定义,在其他源文件可以使用。在一个源程序文件中调用其它源程序文件中定义的外部函数时,必须在本源文件中用函数原型说明它,并加上extern前缀。
所有的函数都具有静态生存期,即分配的空间在程序执行前开始,保持到程序执行结束为止。
文件1:
int f(float x)//函数默认的存储类别是外部函数
{
...
}
文件2:
extern int f(foat);//使用外部函数
C语言杂谈(三)存储类别的更多相关文章
- C语言变量的存储类别
我们知道,从变量的作用域(即从空间)角度来分,可以分为全局变量和局部变量. 从另一个角度,从变量值存在的作时间(即生存期)角度来分,可以分为静态存储方式和动态存储方式. 静态存储方式:是指在程序运行期 ...
- c语言 变量的存储类别以及对应的内存分配?
<h4><strong>1.变量的存储类别</strong></h4>从变量值存在的角度来分,可以分为静态存储方式和动态存储方式.所谓静态存储方式指在程 ...
- C语言函数的存储类别
函数默认的隐含存储类型是extern auto:只能用于局部变量 extern:允许被其他文件调用 static:只能被本源程序文件调用
- C语言存储类别和链接
目录 C语言存储类别和链接 存储类别 存储期 五种存储类别 C语言存储类别和链接 最近详细的复习C语言,看到存储类别的时候总感觉一些概念模糊不清,现在认真的梳理一下.C语言的优势之一能够让程序员恰 ...
- [转]深入探讨C语言中局部变量与全局变量的作用域与存储类别
C语言中局部变量和全局变量变量的作用域与存储类别(auto,static,extern,register) 1.局部变量和全局变量在讨论函数的形参变量时曾经提到,形参变量只在被调用期间才分配内存单元, ...
- C语言_了解一下C语言中的四种存储类别
C语言是一门通用计算机编程语言,应用广泛.C语言的设计目标是提供一种能以简易的方式编译.处理低级存储器.产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言. C语言中的四种存储类别:auto ...
- C语言中存储类别又分为四类:自动(auto)、静态(static)、寄存器的(register)和外部的(extern)。
除法运算中注意: 如果相除的两个数都是整数的话,则结果也为整数,小数部分省略,如8/3 = 2:而两数中有一个为小数,结果则为小数,如:9.0/2 = 4.500000. 取余运算中注意: 该运算只适 ...
- C语言中存储类别、链接与内存管理
第12章 存储类别.链接和内存管理 通过内存管理系统指定变量的作用域和生命周期,实现对程序的控制.合理使用内存是程序设计的一个要点. 12.1 存储类别 C提供了多种不同的模型和存储类别,在内存中 ...
- C语言的存储类别和动态内存分配
存储类别分三大类: 静态存储类别 自动存储类别 动态分配内存 变量.对象--->内存管理 内存考虑效率(时间更短.空间更小) 作用域 链接.---->空间 存储器 ----->时 ...
随机推荐
- <!DOCTYPE> 的理解
[[ from <!DOCTYPE> 标签的深入理解 ]] 前言: 今天被问道“有没有仔细了解过<!DOCTYPE>标签?”,愣了一下,因为一开始在W3cschool上看到过建 ...
- win8.1安装开发工具vs2013.3+mssql2012全程
几个常用的命令 重起计算机命令:shoutdown.exe -r -t 0 立刻重起 在远程桌面中没有关机重起的选项,这个命令是必须的 远程桌面连接:mstsc 硬件环境:I7 4770 64RAM ...
- csharp:Compare two DataTables to rows in one but not the other
/// <summary> /// 账面数据 Accounting /// </summary> /// <returns></returns> Dat ...
- 用于dbnull的数据转换。因为用convert.to无法转换dbnull类型
/// <summary> /// add by wolf /// </summary> public static class ExtendObject { public s ...
- 从几篇文字得到关于web app开发的性能问题的答案
1. http://blogs.adobe.com/creativecloud/are-mobile-web-apps-slow/ 2. http://software.intel.com/zh-cn ...
- Python: Convert rst to html
pip install sphinx rst2html.py in_file.rst out_file.html
- mongodb学习5--mongo的type类型
db.active.group({key:{id:1},cond:{cd:20160913,cid:"fgsdljsdv",aid:"54465"},reduc ...
- linux查看rpm包创建的所有目录和文件
有不少时候,我们需要查看某个rpm创建的所有目录和文件,出于了解程序结构或者其他目的,但是对于这个rpm包我们又不怎么熟悉,这个时候可以通过rpm -ql rpm名称查看. 但是rpm名称有可能又忘了 ...
- CSS应用内容补充及小实例
一.clear 清除浮动 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...
- 如何给span设置高度宽度?
内容提要:给Span设置高度和宽度后没有作用.本文介绍了如何如何给span设置高度宽度. CSS模型中经常用的容器是DIV和span. 给Span设置高度和宽度后没有作用. <style typ ...