写单片机程序时遇到的问题,简化成下例之后。
情况一:
#include <stdio.h>
#include <stdlib.h>
void fun2(){
int a;
printf("a=%d\n",a++);
}
int main(void){
fun2();
fun2();
fun2();
fun2();
return 1;
}
运行结果:
情况二:
#include <stdio.h>
#include <stdlib.h>
void fun2(){
int a=0;
printf("a=%d\n",a++);
}
int main(void){
fun2();
fun2();
fun2();
fun2();
return 1;
}
运行结果:
情况二的结果我能理解,因为每次调用函数fun2时,都对变量a赋初值0,所以打印出的结果是a=0;
但是情况一没有对a赋初值,int型变量默认赋初值0,那么每次调用时,我认为的过程:首先声明一个变量a,没有赋值,默认值为0,打印a的值a=0;下一次调用同上。运行结果和情况二相同。
但是实际运行结果显示a保留了上一次的值,就像一个静态变量,请问这是为什么呢?
因为从栈里面也优先分配前面的空余内存,你一直都是执行这同一个函数,并且只申请一个变量a,执行完fun2又释放,所有第二次申请还是那片内存。
因为a没有赋值,所以a的值是一个程序自动分配的内存地址的对应数值,然后每次调用函数fun2(),执行a++,都是对这个内存地址里的值进行操作,所以表现为像一个静态变量。