4、taticLocalVar();//第二次调用,记忆了第一次退出时的值,输出a=1return0;}应用:利用”记忆性”,记录函数调用的次数(示例程序一)利用生存期的”全局性”,改善”returnapointer/referencetoalocalobject”的问题.Localobject的问题在于退出函数,生存期即结束,.利用static的作用,延长变量的生存期.示例程序二://IPaddresstostringformat//UsedinEthernetFrameandIPHeaderanalysisco
5、nstchar*IpToStr(UINT32IpAddr){staticcharstrBuff[16];//static局部变量,用于返回地址有效constunsignedchar*pChIP=(constunsignedchar*)&IpAddr;sprintf(strBuff,"%u.%u.%u.%u",pChIP[0],pChIP[1],pChIP[2],pChIP[3]);returnstrBuff;}注意事项:1.“记忆性”,程序运行很重要的一点就是可重复性,而static变量的”记忆性”破坏了这种可
6、重复性,造成不同时刻至运行的结果可能不同.2.“生存期”全局性和唯一性.普通的local变量的存储空间分配在stack上,因此每次调用函数时,分配的空间都可能不一样,而static具有全局唯一性的特点,每次调用时,都指向同一块内存,这就造成一个很重要的问题----不可重入性!!!这样在多线程程序设计或递归程序设计中,要特别注意这个问题.(不可重入性的例子可以参见(影印版)第103-105页)下面针对示例程序二,分析在多线程情况下的不安全性.(为方便描述,标上行号)①cons
7、tchar*IpToStr(UINT32IpAddr)②{③staticcharstrBuff[16];//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地址转换成点分
8、10进制的字符串形式.现A先获得执行机会,执行IpToStr(),传入的参数是0x0B090A0A,顺序执行完应该返回的指针存储区内容是:”10.10.9.11”,现执行到⑥时,失去执行权,调度到B线程执行,B线程传入的参数是0xA8A8A8C0,执行至⑦,静态存储区的内容是192.168.168.168.当再调度到A执行时,从⑥继续执行,由于strBuff的全局唯一性,内容已经被B线