Can';无法理解此代码堆栈存储函数调用c的输出

Can';无法理解此代码堆栈存储函数调用c的输出,c,function,stack,C,Function,Stack,我有下面的代码,但是我不明白它输出什么以及为什么输出它的功能 int main(){ int *i; int *fun(); i=fun(); printf("%d\n",*i); printf("%d\n",*i); } int *fun(){ int k=12; return(&k); } 输出为12和一个垃圾值。有人能解释一下结果吗 它不应该同时返回垃圾值吗 我知道k是fun()本地的,所以它会存储在堆栈上,当fun()超出范围时,它

我有下面的代码,但是我不明白它输出什么以及为什么输出它的功能

int main(){
   int *i;
   int *fun();
   i=fun();
   printf("%d\n",*i);
   printf("%d\n",*i);
}

int *fun(){ 
   int k=12;
   return(&k);
}
输出为12和一个垃圾值。有人能解释一下结果吗

它不应该同时返回垃圾值吗

我知道
k
fun()
本地的,所以它会存储在堆栈上,当
fun()
超出范围时,它会被销毁。我在这里遗漏了什么概念

它不会同时返回垃圾值吗

返回
fun
后,
k
不再存在,因此打印存储在
k
地址中的值是未定义的行为

这就是为什么你有不同的垃圾值

k是fun()的局部变量,因此它将存储在堆栈中,当fun结束时,激活将被破坏,或者我是否缺少一些概念


您没有遗漏任何东西,除了堆栈不会立即“作废”或类似的事实。换句话说,在返回
fun
后,编译器可以自由地使用该内存执行任何操作。

当函数返回时,堆栈不会立即清除,因此
12
fun()
返回后仍将在堆栈上,直到其他内容覆盖它


您将在不同的编译器和不同的构建选项(调试与发布)中看到不同的结果。

但每次运行时,我都会得到12,垃圾值。每次第一次打印时,它都会返回12。我不明白。我甚至在TC上编译并运行了它,对于第一个printf和一个垃圾值,它给出了相同的答案12?@ishansoni-这就是未定义的行为-你真的不知道会发生什么,还有谁会改变这个内存,当你试图改变它时会发生什么,或者,如果您取消引用指针
i
,我在某个地方读到,在printf语句之后调用了in-TC垃圾收集器,所以这可能就是原因。