都知道用static修饰的变量是静态数据,此时变量的地址在静态区存放,因此在函数结束时,该地址中的值不被释放,除非主函数结束。
因此每次访问该地址所指向的变量,都会有上次的值。
但是会出现一个问题:
先看看下边的这个程序:
int add(){ static int num=1; num++; return num; } void main(){ int i; for(i=0;i<3;i++){ printf("%d: %dn",i,add()); } }
在每次调用add()函数时,都会首先执行add()中的第一句话,此时,是否每次都会对num进行初始化呢?答案当然是NO;
大神的话:只是在第一次调用add()时,对num进行一次初始化,下次再执行到这句话时,系统会发现已经定义过num这个变量了,就不会对这个变量再进行初始化了。
而下边的这个函数又会是另一种做法:
int add(){ int num=1; num++; return num; } void main(){ int i; for(i=0;i<3;i++){ printf("%d: %dn",i,add()); } }
这个函数在执行过程中,到add()函数中的第一句话时,会定义一个num,并且初始化num,每次调用到add()都会进行同样的过程,定义、初始化。
因为num是一个局部变量,在add()函数结束时,定义的num这个变量会被释放,因此下次再执行到这一步时,发现没有num这个变量,所以会再定义一次,并初始化。