函数里面不赋初值的变量,下一次调用为什么会保留上一次的值呢?

写单片机程序时遇到的问题,简化成下例之后。

情况一:

#include <stdio.h>
#include <stdlib.h>
void fun2(){
    int a;
    printf("a=%d\n",a++);
}

int main(void){
    fun2();
    fun2();
    fun2();
    fun2();
    
    return 1;
}

运行结果:

img

情况二:

#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;
}

运行结果:

img

情况二的结果我能理解,因为每次调用函数fun2时,都对变量a赋初值0,所以打印出的结果是a=0;
但是情况一没有对a赋初值,int型变量默认赋初值0,那么每次调用时,我认为的过程:首先声明一个变量a,没有赋值,默认值为0,打印a的值a=0;下一次调用同上。运行结果和情况二相同。
但是实际运行结果显示a保留了上一次的值,就像一个静态变量,请问这是为什么呢?

因为从栈里面也优先分配前面的空余内存,你一直都是执行这同一个函数,并且只申请一个变量a,执行完fun2又释放,所有第二次申请还是那片内存。

因为a没有赋值,所以a的值是一个程序自动分配的内存地址的对应数值,然后每次调用函数fun2(),执行a++,都是对这个内存地址里的值进行操作,所以表现为像一个静态变量。