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的全局唯一性,内容已经