C/C++存储类、链接和内存管理张晓平武汉大学数学与统计学院Tableofcontents1.
存储类2.
存储类说明符3.
存储类与函数1存储类存储类存储时期(storageduration)变量在内存中保留的时间作用域(scope)变量可被访问的一个或多个区域链接(linkage)与变量的作用域一起来说明程序的哪些部分可以通过变量名来使用它.
在本节中,如不做特别说明,变量也可以是函数参数或函数名.
2作用域作用域作用域是一个变量可被访问的一个或多个区域.
变量的作用域可以是代码块作用域函数原型作用域文件作用域3作用域代码块代码块是包含在开始花括号与对应的结束花括号之间的一段代码.
如函数体循环体分支体一个函数内的任一复合语句4作用域代码块代码块是包含在开始花括号与对应的结束花括号之间的一段代码.
如函数体循环体分支体一个函数内的任一复合语句代码块作用域(blockscope)代码块中定义的变量具有代码块作用域,从变量定义处到代码块的末尾该变量均可见.
4作用域注函数的形参尽管在函数的开始花括号前被定义,但它同样也具有代码块作用域,隶属于包含函数体的代码块.
5作用域注函数的形参尽管在函数的开始花括号前被定义,但它同样也具有代码块作用域,隶属于包含函数体的代码块.
doubleblock(doublex){doubley=0.
0;.
.
.
returny;}5作用域注函数的形参尽管在函数的开始花括号前被定义,但它同样也具有代码块作用域,隶属于包含函数体的代码块.
doubleblock(doublex){doubley=0.
0;.
.
.
returny;}x和y都有直到结束花括号的代码块作用域.
5作用域注循环体中声明的变量,其作用域局限于该循环体.
6作用域注循环体中声明的变量,其作用域局限于该循环体.
doubleblock(doublex){doubley=0.
0;inti;for(i=0;iinta=0;voidf(void);intmain(void)voidf(void)a具有文件作用域,在main()和f()中都可以使用它.
9作用域文件作用域(filescope)一个在所有函数之外定义的变量具有文件作用域.
具有文件作用域的变量从变量定义处到文件结尾处都是可见的.
#includeinta=0;voidf(void);intmain(void)voidf(void)a具有文件作用域,在main()和f()中都可以使用它.
注具有文件作用域的变量可以在不止一个函数中使用,故它也被称为全局变量(globalvariable).
9链接问题当多个源文件链接在一起,我们如何处理相同名字的标识符假设多个源文件均含有变量a,那么它的值到底采用哪个源文件定义的值呢这就涉及到标识符的链接属性.
10链接问题当多个源文件链接在一起,我们如何处理相同名字的标识符假设多个源文件均含有变量a,那么它的值到底采用哪个源文件定义的值呢这就涉及到标识符的链接属性.
链接(linkage)C变量有如下三种链接:外部链接(externallinkage)内部链接(internallinkage)空链接(nolinkage)10链接空链接具有代码块作用域与函数原型作用域的变量有空链接,这意味着它们是由其定义所在的代码块或函数原型所私有的.
11链接空链接具有代码块作用域与函数原型作用域的变量有空链接,这意味着它们是由其定义所在的代码块或函数原型所私有的.
外部与内部链接局变量可能有内部或外部链接.
一个具有外部链接的变量可以在一个多文件程序的任何地方使用;一个具有内部链接的变量可以在一个文件的任何地方使用.
11链接注要区分一个全局变量是具有内部链接还是外部链接,可以看看定义它时是否被关键字static修饰.
若用了static,则它具有内部链接,只能被当前文件使用;否则具有外部链接,程序中的其他文件可以使用它.
12链接注要区分一个全局变量是具有内部链接还是外部链接,可以看看定义它时是否被关键字static修饰.
若用了static,则它具有内部链接,只能被当前文件使用;否则具有外部链接,程序中的其他文件可以使用它.
inta=5;staticintb=3;intmain(void){.
.
.
}.
.
.
12链接注要区分一个全局变量是具有内部链接还是外部链接,可以看看定义它时是否被关键字static修饰.
若用了static,则它具有内部链接,只能被当前文件使用;否则具有外部链接,程序中的其他文件可以使用它.
inta=5;staticintb=3;intmain(void){.
.
.
}.
.
.
和该文件属于同一程序的其他文件可以使用变量a.
变量b是该文件私有的,但可以被该文件的任一函数使用.
12存储时期存储期(storageduration)也称生存期,指的是变量在内存中的时间.
静态存储时期(staticstorageduration)自动存储时期(autostorageduration)13存储时期静态存储时期若一个变量有静态存储时期,则它将在程序执行期间一直存在.
14存储时期静态存储时期若一个变量有静态存储时期,则它将在程序执行期间一直存在.
例全局变量有静态存储时期.
注意,对于全局变量,关键字static表明其链接类型,而非存储时期.
关键字static修饰的代码块作用域变量也具有静态存储时期.
14存储时期自动存储时期(autostorageduration)一般来说,具有代码块作用域的变量具有自动存储时期.
程序进入定义这些变量的代码块时,为其分配内存;当退出该代码块时,将释放内存.
15存储时期自动存储时期(autostorageduration)一般来说,具有代码块作用域的变量具有自动存储时期.
程序进入定义这些变量的代码块时,为其分配内存;当退出该代码块时,将释放内存.
voidbore(intnumber){intindex;for(index=0;indexintmain(void){intx=30;printf("xinouterblock:%d\n",x);{intx=77;printf("xininnerblock:%d\n",x);}printf("xinouterblock:%d\n",x);while(x++intmain(void){intn=10;printf("Initially,n=%d\n",n);for(intn=1;nvoidtrystat(void);intmain(void){intcount;for(count=1;countintunits=0;voidcritic(void);intmain(void){externintunits;printf("Howmanypoundstoafirkinofbutter\n");scanf("%d",&units);while(units!
=56)critic();printf("Youmusthavelookeditup!
\n");return0;}voidcritic(void){printf("Noluck.
Tryagain.
\n");scanf("%d",&units);}45外部变量的使用Howmanypoundstoafirkinofbutter14Noluck.
Tryagain.
56Youmusthavelookeditup!
46外部变量的使用Howmanypoundstoafirkinofbutter14Noluck.
Tryagain.
56Youmusthavelookeditup!
main()与critic()都通过标识符units来访问同一变量.
在C的术语中,称units具有文件作用域、外部链接及静态存储时期.
46存储类具有内部链接的静态变量具有内部链接的静态变量具有内部链接的静态变量这种存储类的变量具有静态存储时期、文件作用域以及内部链接.
通常使用static在所有函数外部进行定义(同外部变量的定义).
staticintnum=1;intmain(void)注普通的外部变量可被程序中的任一文件中所包含的函数使用,而具有内部链接的静态变量只可以被同一文件中的函数使用.
47具有内部链接的静态变量可在函数中使用extern来再次声明任何具有文件作用域的变量,但这并不改变链接.
48具有内部链接的静态变量可在函数中使用extern来再次声明任何具有文件作用域的变量,但这并不改变链接.
inttraveler=1;//externallinkagestaticintstayhome=1;//internallinkageintmain(void){externinttraveler;//useglobaltravelreexternintstayhome;//useglobalstayhome}48具有内部链接的静态变量可在函数中使用extern来再次声明任何具有文件作用域的变量,但这并不改变链接.
inttraveler=1;//externallinkagestaticintstayhome=1;//internallinkageintmain(void){externinttraveler;//useglobaltravelreexternintstayhome;//useglobalstayhome}对该文件而言,traveler和stayhome都是全局的,但只有traveler可被其他文件中的代码使用.
使用extern的两个声明表明main()在使用两个全局变量,但stayhome仍具有内部链接.
48存储类说明符存储类说明符存储类说明符C语言中有5个作为存储类说明符的关键字:autoregisterstaticexterntypedef:它与内存存储无关,由于语法原因被归入此类.
49存储类说明符存储类说明符C语言中有5个作为存储类说明符的关键字:autoregisterstaticexterntypedef:它与内存存储无关,由于语法原因被归入此类.
注关键字static与extern的含义随上下文而不同.
不可以在一个声明中使用一个以上的存储类说明符,这意味着不能将其它任一存储类说明符作为typedef的一部分.
49存储类说明符auto表明一个变量具有自动存储时期,它只能用在具有代码块作用域的变量声明中.
使用它仅用于明确指出意图,使程序更易读.
register也只能用在具有代码块作用域的变量声明中.
它将一个变量归入寄存器存储类,这相当于请求将该变量存储在一个寄存器内,以更快地存取.
register的使用将导致不能获取变量的地址.
50存储类说明符对于static,用于具有代码块作用域的变量声明时,使该变量具有静态存储时期,从而得以在程序运行期间存在并保留其值.
此时,变量仍具有代码作用域和空链接.
用于具有文件作用域的变量声明时,表明该变量具有内部链接.
extern表明你在声明一个已经在别处定义了的变量,若该声明具有文件作用域,所指向的变量必然具有外部链接;若该声明具有代码块作用域,所指向的变量可能具有外部链接也可能具有内部链接,这取决于该变量的定义声明.
51总结自动变量具有代码块作用域、空链接和自动存储时期.
它们是局部的,为定义它们的代码所私有.
寄存器变量与自动变量具有相同的属性,但编译器可能使用速度更快的内存或寄存器来存储它们.
无法获取一个寄存器变量的地址.
52总结具有静态存储时期的变量可能具有外部链接、内部链接或空链接.
当变量在文件的所有函数之外声明时,它是一个具有文件作用域的外部变量,具有外部链接和静态存储时期.
若在这样的声明中再加上static,将获得一个具有静态存储时期、文件作用域和内部链接的变量.
若在一个函数内使用关键字static声明变量,变量将具有静态存储时期、代码块作用域和空链接.
53总结当程序执行到包含变量声明的代码块时,给具有自动存储时期的变量分配内存,并在代码块结束时释放内存.
如果没有初始化,该变量将是垃圾值.
在程序编译时给具有静态存储时期的变量分配内存,并在程序运行时一直保持.
若没有初始化,将被设置为0.
54总结具有代码块作用域的变量局部于包含变量声明的代码块.
具有文件作用域的变量对文件中在它声明之后的所有函数可见.
若一个文件作用域变量具有外部链接,则它可被程序中的其他文件使用;若一个文件作用域变量具有内部链接,则它只能在声明它的文件中使用.
55存储类与函数存储类与函数函数也有存储类.
函数可以是外部的(默认情况下)或者静态的.
外部函数可被其他文件中的函数使用,而静态函数只可以在定义它的文件中使用.
如doublealpha();staticdoublebeta();externdoublegamma();alpha()与gamma()可被程序中其他文件中的函数使用,而beta()不行.
因beta()被限定在同一文件内,故可在其他文件中使用同名的不同函数.
56存储类与函数使用static的原因之一就是创建一个特定模块所私有的函数,从而避免可能的名字冲突.
使用extern来声明在其他文件中定义的函数.
这一习惯做法主要是为了使程序更清晰,因为除非函数声明中使用了关键字static,否则就认为它是extern的.
57
零途云是一家香港公司,主要产品香港cn2 gia线路、美国Cera线路云主机,美国CERA高防服务器,日本CN2直连服务器;同时提供香港多ip站群云服务器。即日起,购买香港/美国/日本云服务器享受9折优惠,新用户有优惠码:LINGTUYUN,使用即可打折。目前,零途云还推出性价比非常高香港多ip站群云服务器,有需要的,可以关注一下。零途云优惠码:优惠码:LINGTUYUN (新用户优惠,享受9折优...
一般大厂都是通过首年才有可以享受爆款活动,然后吸引我们注册他们商家达到持续续费和购买的目的。一般只有大厂才能有这样的魄力和能力首年亏本,但是对于一般的公司和个人厂家确实难过,这几年确实看到不少的同类商家难以生存。这里我们可以看到有对应的套餐方案。不过这两个套餐都是100%CPU独享的,不是有某云商家限制CPU的。但是轻量服务器有个不好的就是带宽是较大且流量是限制的额,分别是1GB和1.2TB月流量...
云基yunbase怎么样?云基成立于2020年,目前主要提供高防海内外独立服务器,欢迎各类追求稳定和高防优质线路的用户。业务可选:洛杉矶CN2-GIA+高防(默认500G高防)、洛杉矶CN2-GIA(默认带50Gbps防御)、香港CN2-GIA高防(双向CN2GIA专线,突发带宽支持,15G-20G DDoS防御,无视CC)。目前,美国洛杉矶CN2-GIA高防独立服务器,8核16G,最高500G ...
手机内存清理工具为你推荐
域名空间代理我想做域名空间代理!虚拟主机购买虚拟主机哪里购买的好?vps主机vps主机用途有哪些?香港虚拟空间最稳定香港虚拟主机空间在哪里?jsp虚拟空间JSP虚拟目录及虚拟路径的配置方法免费网站空间如何免费做网站 免费域名+免费空间+免费网站100m网站空间100M的最好的网站空间价格多少?香港虚拟主机推荐一下香港的虚拟主机公司!新加坡虚拟主机香港云主机和虚拟主机相比较那个好?网络域名网络域名怎么弄?
查询ip openv 外贸主机 海外服务器 e蜗 qingyun hkg 静态空间 中国电信测速器 阿里云邮箱登陆地址 七牛云存储 石家庄服务器 wordpress空间 新网dns 腾讯云平台 腾讯服务器 e-mail windowsserver2012 美国西雅图独立 卡巴斯基免费下载 更多