一个简单的static类型的初始化问题
时间:01-30 10:00 阅读:934次
*温馨提示:点击图片可以放大观看高清大图
简介:都知道用static修饰的变量是静态数据,此时变量的地址在静态区存放,因此在函数结束时,该地址中的值不被释放,除非主函数结束。因此每次访问该地址所指向的变量,都会有上次的值。但是会出现一个问题......
都知道用static修饰的变量是静态数据,此时变量的地址在静态区存放,因此在函数结束时,该地址中的值不被释放,除非主函数结束。
因此每次访问该地址所指向的变量,都会有上次的值。
但是会出现一个问题:
先看看下边的这个程序:
int add(){
static int num=1;
num++;
return num;
}
void main(){
int i;
for(i=0;i<3;i++){
printf("%d: %d\n",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: %d\n",i,add());
}
}
这个函数在执行过程中,到add()函数中的第一句话时,会定义一个num,并且初始化num,每次调用到add()都会进行同样的过程,定义、初始化。
因为num是一个局部变量,在add()函数结束时,定义的num这个变量会被释放,因此下次再执行到这一步时,发现没有num这个变量,所以会再定义一次,并初始化。