c语言中的static关键字

c语言中的static关键字

ID:8977262

大小:19.69 KB

页数:8页

时间:2018-04-13

c语言中的static关键字_第1页
c语言中的static关键字_第2页
c语言中的static关键字_第3页
c语言中的static关键字_第4页
c语言中的static关键字_第5页
资源描述:

《c语言中的static关键字》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、网上的几个介绍,引用在这里static关键字是C,C++中都存在的关键字,它主要有三种使用方式,其中前两种在C/C++语言中使用,第三种只在C++中使用(C,C++中具体细微操作不尽相同,本文以C++为准).(1)局部静态变量(2)外部静态变量/函数(3)静态数据成员/成员函数下面就这三种使用方式及注意事项分别说明一、局部静态变量在C/C++中,局部变量按照存储形式可分为三种auto,static,register(谭浩强,第174-175页)与auto类型(普通)局部变量相比,static局部变量

2、有三点不同1.存储空间分配不同auto类型分配在栈上,属于动态存储类别,占动态存储区空间,函数调用结束后自动释放,而static分配在静态存储区,在程序整个运行期间都不释放.两者之间的作用域相同,但生存期不同.2.static局部变量在所处模块在初次运行时进行初始化工作,且只操作一次3.对于局部静态变量,如果不赋初值,编译期会自动赋初值0或空字符,而auto类型的初值是不确定的.(对于C++中的class对象例外,class的对象实例如果不初始化,则会自动调用默认构造函数,不管是否是static类型)特点:static局部变量

3、的”记忆性”与生存期的”全局性”所谓”记忆性”是指在两次函数调用时,在第二次调用进入时,能保持第一次调用退出时的值.示例程序一#includeusingnamespacestd;voidstaticLocalVar(){ staticinta=0;//运行期时初始化一次,下次再调用时,不进行初始化工作 cout<<"a="<

4、,输出a=1 return0;}应用: 利用”记忆性”,记录函数调用的次数(示例程序一)  利用生存期的”全局性”,改善”returnapointer/referencetoalocalobject”的问题.Localobject的问题在于退出函数,生存期即结束,.利用static的作用,延长变量的生存期.示例程序二://IPaddresstostringformat//UsedinEthernetFrameandIPHeaderanalysisconstchar*IpToStr(UINT32IpAddr){ staticch

5、arstrBuff[16];//static局部变量,用于返回地址有效 constunsignedchar*pChIP=(constunsignedchar*)&IpAddr; sprintf(strBuff,"%u.%u.%u.%u", pChIP[0],pChIP[1],pChIP[2],pChIP[3]); returnstrBuff;}注意事项:1.“记忆性”,程序运行很重要的一点就是可重复性,而static变量的”记忆性”破坏了这种可重复性,造成不同时刻至运行的结果可能不同.2.“生存期”全局性和唯一性.普通的loc

6、al变量的存储空间分配在stack上,因此每次调用函数时,分配的空间都可能不一样,而static具有全局唯一性的特点,每次调用时,都指向同一块内存,这就造成一个很重要的问题----不可重入性!!!这样在多线程程序设计或递归程序设计中,要特别注意这个问题.(不可重入性的例子可以参见(影印版)第103-105页)下面针对示例程序二,分析在多线程情况下的不安全性.(为方便描述,标上行号)①constchar*IpToStr(UINT32IpAddr)②{③ staticcharstrBuff[1

7、6];//static局部变量,用于返回地址有效④ constunsignedchar*pChIP=(constunsignedchar*)&IpAddr;⑤ sprintf(strBuff,"%u.%u.%u.%u", pChIP[0],pChIP[1],pChIP[2],pChIP[3]);⑥ returnstrBuff;⑦}假设现在有两个线程A,B运行期间都需要调用IpToStr()函数,将32位的IP地址转换成点分10进制的字符串形式.现A先获得执行机会,执行IpToStr(),传入的参数是0x0B090A0A,顺序执

8、行完应该返回的指针存储区内容是:”10.10.9.11”,现执行到⑥时,失去执行权,调度到B线程执行,B线程传入的参数是0xA8A8A8C0,执行至⑦,静态存储区的内容是192.168.168.168.当再调度到A执行时,从⑥继续执行,由于strBuff的全局唯一性,内容已经

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。