为什么我的printfs给出不同的值?

Cha*_*Pai 1 c printf scope

可能重复:
可以在其范围之外访问局部变量的内存吗?

第二个问题是printf什么?

#include<stdio.h>
int* fun() {
   int a =10;
   return &a;
}
int main() {
   int *a;
   a = fun();
   printf("%d",*a);
   printf("%d",*a);
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

我已经返回了局部变量的地址并将其传递给了printf.它第一次正确打印为"10",但第二次显示垃圾值.

如果最初a是指向地址的悬空指针10,为什么不是第二次呢?

有谁能解释一下?

我甚至printf在第一次调用之前尝试调用其他函数,但我仍然得到相同的输出.

在BeniBela的回答之后我尝试了这个...

#include<stdio.h>
int* fun()
{
int a =10;
return &a;
}
void fun2(int d)
{
int a,b,c;
}

int main()
{
int *a,b;
a = fun();
fun2(5);
printf("%d",*a);
printf("%d",*a);
return 0;
}
Run Code Online (Sandbox Code Playgroud)

仍然相同的输出.. :(

Alo*_*ave 9

没有问题printf,您的代码有一个未定义的行为.
您返回函数本地变量的地址,变量的生命周期仅限于函数的作用域({,}),一旦函数的作用域结束,变量就存在更长.标准不需要变量存在了.

所以你的指针引用了一些不存在的东西(虽然它可能).简单地说,它是未定义的行为,你是编译器的怜悯,它可能会向你展示任何行为,并没有提供相同的解释.